Python子进程:命令在Python中失败,但在Shell中工作

Tet*_*suo 1 python command-line subprocess

我试图通过Python的子进程运行命令,但无法正常运行。如果我输入外壳:

pack < packfile.dat
Run Code Online (Sandbox Code Playgroud)

pack我的软件在哪里,又packfile是输入文件,那么软件运行正常。

如果我在python中尝试:

import subprocess as sp
import shlex

cmd = 'pack < packfile.dat'.split()
p = sp.Popen(cmd)
Run Code Online (Sandbox Code Playgroud)

该软件抱怨:

Pack must be run with: pack < inputfile.inp 

Reading input file... (Control-C aborts)
Run Code Online (Sandbox Code Playgroud)

它挂在那里。

最后一部分特定于我的软件,但事实是,运行两种命令的两种方法给出的结果不同,而实际情况并非如此。

谁能告诉我我在做什么错?

实际上,我最终打算这样做:

p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE)
stdout, stderr = p.communicate()
Run Code Online (Sandbox Code Playgroud)

由于我对此并不陌生,如果这不是最佳做法,请告诉我。

提前致谢。

Car*_*arl 5

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

p = sp.Popen(cmd, shell=True)
Run Code Online (Sandbox Code Playgroud)

subprocess.Popen()IO重定向

从那里您还将看到有些人不喜欢shell选项。在这种情况下,您可以使用以下方法完成此操作:

with open('input.txt', 'r') as input:
    p = subprocess.Popen('./server.py', stdin=input)
Run Code Online (Sandbox Code Playgroud)