指定os的输出。系统的一个变量,并防止它显示在屏幕上

我想将我使用os.system运行的命令的输出分配给一个变量,并防止它输出到屏幕上。但是,在下面的代码中,输出被发送到屏幕,并且为var打印的值为0,我猜这表示命令是否成功运行。是否有办法将命令输出分配给变量并阻止它在屏幕上显示?

var = os.system("cat /etc/services")
print var #Prints 0
681300 次浏览

从"https://stackoverflow.com/questions/1410976/equivalent-of-backticks-in-python",这是我很久以前问过的,你可能想使用的是popen:

os.popen('cat /etc/services').read()

Python 3.6文档

这是使用subprocess.Popen实现的;看那个类 提供更强大的管理和通信方式的文档 子流程。< / p >

下面是subprocess的对应代码:

import subprocess


proc = subprocess.Popen(["cat", "/etc/services"], stdout=subprocess.PIPE, shell=True)
(out, err) = proc.communicate()
print("program output:", out)

commands模块是一种相当高级的实现方式:

import commands
status, output = commands.getstatusoutput("cat /etc/services")

状态为0,输出为/etc/services的内容

你可能还想看看subprocess模块,它被构建来取代整个Python __abc1类型调用家族。

import subprocess
output = subprocess.check_output("cat /etc/services", shell=True)

它的优点是在如何调用命令方面有很大的灵活性,可以连接标准的in/out/error流等。

我知道这个问题已经被回答了,但我想分享一种通过使用from x import x和函数调用Popen的可能更好看的方法:

from subprocess import PIPE, Popen




def cmdline(command):
process = Popen(
args=command,
stdout=PIPE,
shell=True
)
return process.communicate()[0]


print cmdline("cat /etc/services")
print cmdline('ls')
print cmdline('rpm -qa | grep "php"')
print cmdline('nslookup google.com')

我用os.system临时文件来做:

import tempfile, os


def readcmd(cmd):
ftmp = tempfile.NamedTemporaryFile(suffix='.out', prefix='tmp', delete=False)
fpath = ftmp.name
if os.name=="nt":
fpath = fpath.replace("/","\\") # forwin
ftmp.close()
os.system(cmd + " > " + fpath)
data = ""
with open(fpath, 'r') as file:
data = file.read()
file.close()
os.remove(fpath)
return data

对于python 3.5+,建议使用从子进程模块运行函数。这将返回一个CompletedProcess对象,从中您可以轻松地获得输出以及返回代码。因为您只对输出感兴趣,所以可以像这样编写实用程序包装器。

from subprocess import PIPE, run


def out(command):
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True)
return result.stdout


my_output = out("echo hello world")
# Or
my_output = out(["echo", "hello world"])

Python 2.6和3特别指出避免使用PIPE作为标准输出和标准错误。

正确的方法是

import subprocess


# must create a file object to store the output. Here we are getting
# the ssid we are connected to
outfile = open('/tmp/ssid', 'w');
status = subprocess.Popen(["iwgetid"], bufsize=0, stdout=outfile)
outfile.close()


# now operate on the file
from os import system, remove
from uuid import uuid4


def bash_(shell_command: str) -> tuple:
"""


:param shell_command: your shell command
:return: ( 1 | 0, stdout)
"""


logfile: str = '/tmp/%s' % uuid4().hex
err: int = system('%s &> %s' % (shell_command, logfile))
out: str = open(logfile, 'r').read()
remove(logfile)
return err, out


# Example:
print(bash_('cat /usr/bin/vi | wc -l'))
>>> (0, '3296\n')```