Python 子进程 : Command Fails in Python but Works in Shell

标签 python command-line subprocess

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

相关文章:

command-line - SSH SCP 本地文件到 Mac Os X 终端中的远程

python - 打开程序后通过python挂起的终端命令

python - 为什么此代码在 Python3.1 中的行为与在 Python2.6 中的行为不同?

python - PIP 安装无法找到 ffi.h,即使它识别 libffi

python - Python 2.6.6 的 zip 创建问题

c# - NDesk.Options/Mono.Options : Parameter with multiple key/value pairs

c++ - 如何使 linux 命令行程序在 windows 中运行?

在 Windows 上检查子进程的退出状态

python - Spacy 2.0.11 要求 regex==2017.4.5,但您将拥有不兼容的 regex 2017.11.9

python - Jupyter 笔记本中的阻塞式交互式绘图