Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中执行shell程序而不打印到屏幕_Python_Python 2.7_Subprocess - Fatal编程技术网

在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_

有没有一种方法可以让我从Python中执行一个shell程序,将其输出打印到屏幕上,并将其输出读取到变量中,而不在屏幕上显示任何内容

这听起来有点混乱,所以也许我可以通过一个例子更好地解释它

比如说,我有一个程序,在执行时将一些东西打印到屏幕上

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。