2

我正在尝试通过 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()

由于我对此有点陌生,如果这不是最佳实践,请告诉我。

提前致谢。

4

3 回答 3

5

I/O 重定向是 shell 的产物,默认情况下 Popen 不使用它。试试这个:

p = sp.Popen(cmd, shell=True)

subprocess.Popen() IO 重定向

从那里您还会看到有些人不喜欢 shell 选项。在这种情况下,您可能可以通过以下方式完成它:

with open('input.txt', 'r') as input:
    p = subprocess.Popen('./server.py', stdin=input)
于 2012-09-27T15:17:52.280 回答
1

“<”不是命令的参数,也不应该作为一个参数传递。

尝试:

p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE, stdin=open('packfile.dat'))
于 2012-09-27T15:18:46.337 回答
1

试试这个:

import subprocess as sp
p = sp.Popen(['pack'], stdin = open('packfile.dat', 'r'))
于 2012-09-27T15:18:48.007 回答