others - python将os.system的输出分配给变量,并阻止它在屏幕上显示

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


var = os.system("cat/etc/services")


print var #Prints 0



时间:

我很久以前问过"python中Bash反斜杠的等价"你可能想要使用的是 popen:


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



来自 python 3.6的文档,

这是使用subprocess实现的;参见类的文档以获得更强大的管理和通信子流程的方法,

下面是subprocess的相应代码:


import subprocess



proc = subprocess.Popen(["cat","/etc/services"], stdout=subprocess.PIPE, shell=True)


(out, err) = proc.communicate()


print"program output:", out



你可能还想查看 subprocess 模块,该模块是为了替换整个 python popen -type调用系列而构建,


import subprocess


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



它的优点是调用命令的方式有很大的灵活性,标准的输入/输出/错误流是连接的,等等。

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


import commands


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



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

我知道这已经得到了解答,但是,我想通过使用来分享一种可能更好看的方式来调用Popen, from x import x 函数和函数:


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 ,建议你使用子进程模块中的运行函数, 返回一个 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



python2.6和3特别说明要避免使用PIPE stdout 和stderr,

正确的方法是


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



...