有没有一种方法可以让我从 Python 执行一个 shell 程序,它将其输出打印到屏幕上,并将其输出读入一个变量而不在屏幕上显示任何内容?
这听起来有点令人困惑,所以也许我可以通过一个例子更好地解释它。
假设我有一个程序在执行时会在屏幕上打印一些东西
bash> ./my_prog
bash> "Hello World"
当我想将输出读入 Python 中的变量时,我读到一个好的方法是subprocess
像这样使用模块:
my_var = subprocess.check_output("./my_prog", shell=True)
使用这个结构,我可以将程序的输出输入到my_var
(here "Hello World"
),但是当我运行 Python 脚本时它也会打印到屏幕上。有什么办法可以抑制这种情况吗?我在文档中找不到任何subprocess
内容,所以也许还有另一个模块可以用于此目的?
编辑:我刚刚发现commands.getoutput()
可以让我这样做。但是还有没有办法实现类似的效果subprocess
?因为我打算在某个时候制作一个 Python3 版本。
EDIT2:特定示例
摘自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
屏幕输出(请注意,不是“所有内容”都打印到屏幕上,只是输出的一部分,如果我使用commands.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