我编写了一个Python脚本,可以从命令行调用。我正在编写GUI包装器但不想更改main函数。在GUI代码中,我使用subprocess.run(['./executable.py', input])
调用脚本,但输入在executable.py
的{{1}}列表中不可见。如何传递输入以使其对sys.argv
可见?
以下是我保存为sys.argv
的测试脚本(使其可执行test.py
):
chmod +x test.py
以下是我从命令行调用它时得到的结果:
#!/usr/bin/env python
# script to test using sys.argv with subprocess
import sys
print(sys.argv)
以下是我在python shell中调用它时得到的结果:
$> ./test.py input.txt
['./test.py', 'input.txt']
如何让>>> import subprocess
>>> output = subprocess.run(['./test.py', 'input.txt'], shell=True, stdout=subprocess.PIPE)
>>> >>> print(output.stdout)
b"['./test.py']\n"
显示在input.txt
?
答案 0 :(得分: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=True
(note on when you should use shell=True
)。