将os.system的输出分配给一个variables,并防止它显示在屏幕上

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

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

从“ Python中Bash反引号的等价物 ”中,我很久以前就问过,你可能想要使用的是popen

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

我被告知subprocess是一个更好的方法来解决这个问题,所以这里是相应的代码:

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

您可能还想看看构build的subprocess模块,以取代整个Python系列的popen type调用。

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

它的优势在于,如何调用命令,标准input/输出/错误stream连接等方面具有很大的灵活性。

命令模块是一个相当高级的方式来做到这一点:

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

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

我知道这已经被回答了,但是我想通过使用from x import x和functions来分享一个更好的方式来调用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') 

对于Python 3.5+,build议使用subprocess模块的运行function 。 这将返回一个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"]) 

我用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 2.6和Python3特别说避免使用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 

非常感谢您的答复,非常有帮助。 但在我的情况下,并不足以接收来自http服务器的响应。因此,在系统执行请求之后,我添加了一个带有超时(例如30秒)的“while”:阻止程序并等待http响应只有系统调用的结果。 也许奇怪,但它的作品!

 import subprocess # create a file object to store the output : tmp/tempfile. cmd = "curl -X POST --data-urlencode \"parameter=" + someparametervalue + "\" http://localhost/reponse.php" outfile = open('tmp/tempfile', 'w'); status = subprocess.Popen(cmd, bufsize=0, stdout=outfile) outfile.close() # wait for outfile really contains something : the response of the http server infile = open('tmp/tempfile', 'r'); starttime = datetime.utcnow() data='' timeout=False while data=='' and not timeout: data=infile.read() timeout=(datetime.utcnow()-starttime).total_seconds()>30 infile.close() # now operate on received data