2011-08-09 21 views
1

私はそれを試みましたが、これらの引数を出力しようとすると値は返されません。 私は以下の私のコード発行:パイプを使って外部プログラムを実行し、引数をPythonで渡す

SCRIPT1外部のPythonプログラムを実行します(スクリプト2)

#(...) 
proc = subprocess.Popen(['export PYTHONPATH=~/:$PYTHONPATH;' + 
    'export environment=/path/to/environment/;' + 
    'python /path/to/my/program/myProgram.py', 
    '%(date)s' %{'date':date}, '%(time)s' %{'time':time}], 
    stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True) 
#(...) 

スクリプト2 SCRIPT1

#(...) 
print sys.argv[0] #prints the name of the command 
print sys.argv[1] #it suppose to print the value of the first argument, but it doesn't 
print sys.argv[2] #it suppose to print the value of the second argument, but it doesn't 
#(...) 
+0

あなたは 'shlex.split'を使用してみましたが? – BrainStorm

+0

いいえ、本当にそうではありませんか? –

答えて

1

によって実行されているスクリプト1のこのバージョンをお試しください:

proc = subprocess.Popen('python /path/to/my/program/myProgram.py %s %s' % (date, time), 
         stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True, 
         env = {'PYTHONPATH': '~/:$PYTHONPATH', 
           'environment': '/path/to/environment/'}) 

問題があれば簡単に見つかるはずですうまくいきません。しかし私はそれができると思います。

+0

残念ながら、それはうまくいきませんでした。実際には、script2の出力も印刷されませんでした。 –

+0

編集後に試しましたか?そして '= PIPE'引数なしで試しましたか? – agf

+0

私は= PIPE引数なしで試してみましたが、ライブラリをインポートできないのでエラーがスローされるので、正しくエンベロープが設定されていない可能性があります –

1

Docs shell = Trueを指定すると、追加のargsはコマンドではなくシェルに対してargsとして扱われます。動作させるには、シェルをFalseに設定するだけです。なぜあなたはそれが真実である必要があるのか​​わかりません。

編集:あなたは環境変数を設定するためにシェルを使いたいと思う。代わりに環境変数を設定するには、env引数を使用します。

+0

その他の2つの回答は重要な問題です。 – senderle

+0

ライブラリを最初にエクスポートする必要があるので、シェルが必要です。 –

+0

私が言ったように。代わりにenv引数を使用して環境を設定してください。現在の環境から環境変数をコピーする必要がある場合は、 'os'モジュールに' environ'をコピーしてください。 – Dunes

1
  1. 環境変数を渡すために使用Popenenvパラメータ:
  2. あなたがする必要がある場合を除きshell=Trueを使用しないでください。これはsecurity risk (see Warning)です。

test.py:

import subprocess 
import shlex 
import datetime as dt 
now=dt.datetime.now() 
date=now.date() 
time=now.strftime('%X') 

proc = subprocess.Popen(shlex.split(
    'python /tmp/test2.py %(date)s %(time)s'%{'date':date, 
             'time':time}), 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE, 
         env={'PYTHONPATH':'~/:$PYTHONPATH', 
          'environment':'/path/to/environment/'}) 

out,err=proc.communicate() 
print(out) 
print(err) 

がtest2.py:

import sys 
import os 

print(os.environ['PYTHONPATH']) 
print(os.environ['environment']) 
for i in range(3): 
    print(sys.argv[i]) 

利回り

~/:$PYTHONPATH 
/path/to/environment/ 
/tmp/test2.py 
2011-08-09 
17:50:04 
+0

'print sys.argv [0]'が動作している場合、パイプは問題ではありません。 'env'パラメータの呼び出しがうまくいっています。 – agf

+0

@agf:良いコール、それを指摘してくれてありがとう。 – unutbu

関連する問題