我正在尝试通过 Python 的子进程运行命令,但它无法正常运行。如果我在 shell 中输入:
pack < packfile.dat
其中pack
是我的软件,packfile
是输入文件,那么软件运行正常。
如果我在 python 中尝试这个:
import subprocess as sp
import shlex
cmd = 'pack < packfile.dat'.split()
p = sp.Popen(cmd)
软件提示:
Pack must be run with: pack < inputfile.inp
Reading input file... (Control-C aborts)
它卡在那里。
这最后一部分是我的软件特有的,但事实是运行相同命令的两种方法会给出不同的结果,而事实并非如此。
谁能告诉我我做错了什么?
实际上,我打算最终做到:
p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE)
stdout, stderr = p.communicate()
由于我对此有点陌生,如果这不是最佳实践,请告诉我。
提前致谢。
最佳答案
I/O 重定向是 shell 的产物,默认情况下 Popen 不使用它。试试这个:
p = sp.Popen(cmd, shell=True)
subprocess.Popen() IO redirect
从那里您还会看到有些人不喜欢 shell 选项。在那种情况下,您可能可以通过以下方式完成它:
with open('input.txt', 'r') as input:
p = subprocess.Popen('./server.py', stdin=input)
关于Python 子进程 : Command Fails in Python but Works in Shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12624646/