我有一个问题,我使用python发出命令,然后接受值来创建服务列表。
serviceList = subprocess.Popen(command, shell=True, stdout =subprocess.PIPE).stdout.read()
print serviceList
command
是一个工作命令,当我将其复制并粘贴到cmd中时,它可以很好地工作,为我提供服务列表及其状态。
如果我运行此命令,它只返回任何内容。当我打印出serviceList时,它是空白的。
我正在使用python 2.7
答案 0 :(得分:2)
您必须使用communicate()
方法而不是stdout.read()
来获取serviceList
的值。
即使是Python文档也推荐它。
警告:使用
communicate()
而非.stdin.write
,.stdout.read
或.stderr.read
以避免因任何其他操作系统管道缓冲区填充而导致的死锁起来并阻止儿童进程。
试试这个:
proc = subprocess.Popen(command, shell=True, stdout =subprocess.PIPE)
serviceList = proc.communicate()[0]
print serviceList
communicate()
返回元组(stdoutdata, stderrdata)
。在这里,我将元组的第一个元素分配给serviceList
。
答案 1 :(得分:1)
如果程序只打印出一堆信息然后退出,那么读取输出的一种更简单的方法(也没有办法让它因完全缓冲而死锁)将会调用:
process = subprocess.Popen(command) # only call shell=True if you *really need it
stdoutdata, stderrdata = process.communicate() # blocks until process terminates
*使用外部输入调用shell = True会打开shell注入攻击的代码,应谨慎使用
答案 2 :(得分:0)
要保存标准输出,请在代码中添加output = serviceList.stdout.readlines()
。
答案 3 :(得分:0)
还有子进程函数check_output(),它以块字符串的形式阻塞并返回进程的输出。如果你想避免阻塞,你可以创建一个调用它的函数,并将其用作新Thread()的目标,例如。
import subprocess
import threading
def f():
print subprocess.check_output([command])
threading.Thread(target=f).start()