什么时候'命令'比'popen'子进程更可取?

时间:2012-07-27 19:37:06

标签: python subprocess popen

我在没有上学的情况下学习系统管理,所以有时我会错过许多其他人的基本信息。

我试图在打印之前给我的stdout行另一个参数,但是我不确定我应该使用哪个进程,而且如果这是我应该使用的那么我对子进程的命令有点模糊。

我目前的代码是:

f = open('filelist', 'r')
searchterm = f.readline()
f.close()|
#takes line from a separate file and gives it definition so that it may be callable.

import commands
commands.getoutput('print man searchterm')

这是在运行,但没有给我一个shell的输出。我更重要的问题是,我是否使用正确的命令来获得我的首选流程?我应该使用其中一个子进程命令吗?我试着玩popen,但我不完全理解它正确使用它。

是的,我正在跑步

subprocess.Popen('print man searchterm') 

但毫无疑问,我知道你不应该如何运行它。 Popen需要的参数多于我给出的参数,比如文件位置和运行位置(Stdout或stderr)。但我无法使这些命令工作。它会是这样的:

subprocess.Popen(pipe=stdout 'man' 'searchterm')
#am unsure how to give the program my arguments here.  

我一直在研究各地,但它是一个如此广泛使用的过程,我似乎正在遭受过多的信息而不是不够。任何帮助将不胜感激,我很新。

先发制人,谢谢您的帮助。

3 个答案:

答案 0 :(得分:3)

从单独的流程获取数据的通用方法是使用subprocess(不推荐使用commands

import subprocess
p = subprocess.Popen(['print','man','searchitem'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdoutdata, stderrdata = p.communicate()

请注意,存在一些便利函数,用于将字符串拆分为参数列表。最值得注意的是shlex.split,它将接受一个字符串并将其拆分为一个与shell相同的列表。 (如果字符串中没有引用任何内容,str.split()也可以正常工作。)

答案 1 :(得分:0)

commands在Python 2.6及更高版本中已被弃用,并且已在Python 3中删除。在新代码中,即使您遇到Python 2.5或更早版本,也可能没有这种情况更可取。

答案 2 :(得分:0)

来自the docs

  

从2.6版开始不推荐使用:已删除命令模块   Python 3.改为使用子进程模块。

要在单独的流程中运行man searchterm并在终端中显示结果,您可以这样做:

import subprocess
proc = subprocess.Popen('man searchterm'.split())
proc.communicate()