2017-05-29 13 views
0

私はコマンドラインから呼び出すように書いたPythonスクリプトを持っています。私はGUIラッパーを書いていますが、主な機能を変更したくありません。 GUIコードでは、subprocess.run(['./executable.py', input])を使用してスクリプトを呼び出していますが、入力はexecutable.pysys.argvリストには表示されません。 sys.argvに表示されるように入力をどのように渡しますか?ここで別のPythonスクリプトの `sys.argv`リストに入力を渡すにはどうしたらいいですか?

は、私は(chmod +x test.pyそれが実行可能に)test.pyとして保存したテストスクリプトである:ここで

#!/usr/bin/env python 
# script to test using sys.argv with subprocess 

import sys 

print(sys.argv) 

は、コマンドラインからこれを呼び出すときに、私が得るものです:

$> ./test.py input.txt 
['./test.py', 'input.txt'] 

はこちら私がPythonシェルの中からこれを呼び出すときに得られるもの:

>>> import subprocess 
>>> output = subprocess.run(['./test.py', 'input.txt'], shell=True, stdout=subprocess.PIPE) 
>>> >>> print(output.stdout) 
b"['./test.py']\n" 

input.txtを表示させるにはどうすればよいですか?

+0

本当に必要なことが分かっていない限り、 'shell = True'を使用しないでください。 –

答えて

0

これを行うための最も安全な方法は、単純に削除することですshell=True

>>> import subprocess 
>>> output = subprocess.run(['./test.py', 'input.txt'], stdout=subprocess.PIPE) 
>>> print(output.stdout) 
b"['./test.py', 'input.txt']\n" 

他のオプションは単一の文字列に入力のリストを組み合わせることである。

>>> import subprocess 
>>> output = subprocess.run('./test.py input.txt', shell=True, stdout=subprocess.PIPE) 
>>> print(output.stdout) 
b"['./test.py', 'input.txt']\n" 

私は完全にわかりません元のメソッド(入力リストとshell=Trueで失敗する)が失敗する理由それにかかわらず、running unintended commands/codeを避けるには、shell=Truenote on when you should use shell=True)の使用を避けるのが最善です。

+0

代わりに 'shell = True'を削除する方が良いでしょう。 – jordanm

+0

@ StevenC.Howell 'shell = True'はかなり危険です。詳しくは、ドキュメントをご覧ください:https://docs.python.org/3/library/subprocess.html#security-considerations – olisch

関連する問題