在Python中执行shell程序而不打印到屏幕
有没有一种方法可以让我从Python中执行一个shell程序,将其输出打印到屏幕上,并将其输出读取到变量中,而不在屏幕上显示任何内容 这听起来有点混乱,所以也许我可以通过一个例子更好地解释它 比如说,我有一个程序,在执行时将一些东西打印到屏幕上在Python中执行shell程序而不打印到屏幕,python,python-2.7,subprocess,Python,Python 2.7,Subprocess,有没有一种方法可以让我从Python中执行一个shell程序,将其输出打印到屏幕上,并将其输出读取到变量中,而不在屏幕上显示任何内容 这听起来有点混乱,所以也许我可以通过一个例子更好地解释它 比如说,我有一个程序,在执行时将一些东西打印到屏幕上 bash> ./my_prog bash> "Hello World" 当我想将输出读入Python中的变量时,我了解到一个好的方法是使用子流程模块,如下所示: my_var = subprocess.check_output("./my_
bash> ./my_prog
bash> "Hello World"
当我想将输出读入Python中的变量时,我了解到一个好的方法是使用子流程
模块,如下所示:
my_var = subprocess.check_output("./my_prog", shell=True)
有了这个结构,我可以将程序的输出输入到my_var
(这里“Hello World”
),但是当我运行Python脚本时,它也会打印到屏幕上。有没有办法抑制这种情况?我在子流程
文档中找不到任何内容,因此可能还有另一个模块可以用于此目的
编辑:
我刚刚发现,commands.getoutput()
允许我这样做。但是在子流程中是否也有实现类似效果的方法?因为我计划在某个时候制作一个Python3版本
编辑2:特别的例子
摘自python脚本:
oechem_utils_path = "/soft/linux64/openeye/examples/oechem-utilities/"\
"openeye/toolkits/1.7.2.4/redhat-RHEL5-g++4.3-x64/examples/"\
"oechem-utilities/"
rmsd_path = oechem_utils_path + "rmsd"
for file in lMol2:
sReturn = subprocess.check_output("{rmsd_exe} {rmsd_pars}"\
" -in {sIn} -ref {sRef}".format(rmsd_exe=sRmsdExe,\
rmsd_pars=sRmsdPars, sIn=file, sRef=sReference), shell=True)
dRmsds[file] = sReturn
屏幕输出(请注意,并非“所有内容”都打印到屏幕上,只是屏幕的一部分
输出,如果我使用命令。getoutput
一切正常:
/soft/linux64/openeye/examples/oechem-utilities/openeye/toolkits/1.7.2.4/redhat-RHEL5-g++4.3-x64/examples/oechem-utilities/rmsd: mols in: 1 out: 0
/soft/linux64/openeye/examples/oechem-utilities/openeye/toolkits/1.7.2.4/redhat-RHEL5-g++4.3-x64/examples/oechem-utilities/rmsd: confs in: 1 out: 0
/soft/linux64/openeye/examples/oechem-utilities/openeye/toolkits/1.7.2.4/redhat-RHEL5-g++4.3-x64/examples/oechem-utilities/rmsd - RMSD utility [OEChem 1.7.2]
/soft/linux64/openeye/examples/oechem-utilities/openeye/toolkits/1.7.2.4/redhat-RHEL5-g++4.3-x64/examples/oechem-utilities/rmsd: mols in: 1 out: 0
/soft/linux64/openeye/examples/oechem-utilities/openeye/toolkits/1.7.2.4/redhat-RHEL5-g++4.3-x64/examples/oechem-utilities/rmsd: confs in: 1 out: 0
如果subprocess.check\u output
不适用于您,请使用对象和PIPE
以Python捕获程序的输出
prog = subprocess.Popen('./myprog', shell=True, stdout=subprocess.PIPE)
output = prog.communicate()[0]
.communicate()
方法将等待一个程序完成执行,然后返回一个(stdout,stderr)
元组,这就是为什么您要获取该元组的[0]
如果还希望捕获stderr
,则将stderr=subprocess.PIPE
添加到Popen
对象的创建中
如果希望在prog
运行时捕获其输出,而不是等待其完成,则可以调用line=prog.stdout.readline()
一次读取一行。请注意,如果没有可用的行,直到有一行可用时,此操作将挂起。如果子流程。检查输出是否不适用于您,请使用对象和管道
以Python捕获程序的输出
prog = subprocess.Popen('./myprog', shell=True, stdout=subprocess.PIPE)
output = prog.communicate()[0]
.communicate()
方法将等待一个程序完成执行,然后返回一个(stdout,stderr)
元组,这就是为什么您要获取该元组的[0]
如果还希望捕获stderr
,则将stderr=subprocess.PIPE
添加到Popen
对象的创建中
如果希望在prog
运行时捕获其输出,而不是等待其完成,则可以调用line=prog.stdout.readline()
一次读取一行。请注意,如果没有可用的行,此选项将挂起,直到有一行为止。我一直使用此选项,正常情况下不会输出。我一直使用此选项,正常情况下不会输出。要添加到Ryan Haining的答案中,您还可以处理stderr以确保屏幕上不会打印任何内容:
p = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, close_fds=True)
out,err = p.communicate()
为了补充Ryan Haining的答案,您还可以处理stderr以确保屏幕上没有打印任何内容:
p = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, close_fds=True)
out,err = p.communicate()
你确定吗?因为checkout\u output
只是以字符串形式返回输出,屏幕上不会刷新任何内容。是的,我会在几分钟后将准确的输入和输出发布到我的初始查询中。我已经在EDIT2
下添加了特定问题。你确定吗?因为checkout\u output
只是以stri形式返回输出ng,屏幕上没有刷新任何内容。是的,我会在几分钟后将准确的输入和输出发布到我的初始查询中。我已经在EDIT2
下添加了特定问题。谢谢,我以前尝试过,但它仍然将一些输出打印到屏幕上。嗯,也许这只是这个特定程序的问题,我将继续commands.getoutput
@SebastianRaschka正如我在回答中所说的,您还可以捕获stderr
,这可能是打印“部分输出”的原因是,谢谢,只是不知怎么地忽略了它,因为此输出只是“常规”输出,而不是“错误”通知谢谢,我以前尝试过,但它仍然会将一些输出打印到屏幕上。嗯,也许这只是这个特定程序的问题,我将只使用命令。getoutput
@SebastianRaschka正如我在回答中所说,您还可以捕获stderr
,这可能是“部分输出”的原因被打印是的,谢谢,只是不知何故忽略了它,因为这个输出只是“常规”输出而不是“错误”通知啊,我忘记了stderr
!谢谢,这解决了我的问题!你可以使用output=check\u输出(cmd,stderr=STDOUT)
,在单个变量中捕获stdout和stderr。啊,我忘记了stderr
!谢谢,这解决了我的问题!您可以使用output=check\u output(cmd,stderr=stdout)
,在单个变量中捕获stdout和stderr。