Python:从后台子进程获取标准输出
我试图通过一个python脚本,即'ifconfig -a eht0'在linux机器上获取网络接口的信息。所以我用下面的代码:Python:从后台子进程获取标准输出
import subprocess
proc = subprocess.Popen('ifconfig -a eth0', shell=True, stdout=subprocess.PIPE)
proc.wait()
output = proc.communicate()[0]
那么,如果我执行从终端的脚本
python myScript.py
或
python myScript.py &
它工作正常,但在运行时从后台(由crontab启动)没有活动外壳,我无法得到输出。
有什么想法?
谢谢
尝试proc.stdout.readline()而不是沟通,subprocess.Popen()中的stderr = subprocess.STDOUT可能会有所帮助。请发布结果。
从终端启动脚本会给出'eth0 Link encap:Ethernet HWaddr 18:b2:23:a4:12:1e'而不是完整的输出,并且如果由cron运行,它会再次提供空字符串。 – user3734366
我建议你使用proc.communicate。你有没有试过用2>&1重定向标准错误输出? –
也尝试从crontab调用脚本,并在调用脚本的行重定向输出(可能相关,我不是一个强大的crontab用户[link](https://unix.stackexchange.com/questions/) 52330 /如何对重定向输出到一个文件从 - 内 - 的cron) –
我发现问题的解决方案,我猜系统无法识别由crontab执行的功能ifconfig
。因此,添加子进程的完整路径允许脚本正确执行:
`proc = subprocess.Popen('/sbin/ifconfig -a eth0',shell=True,stdout=subprocess.PIPE)
proc.wait()
output = proc.communicate()[0]`
现在我可以管理输出字符串。
谢谢
你怎么用'output'来查看它是否有效(无论是在后台还是在主动shell)?你把它保存到一个文件?如果是这样,文件是否被创建,但没有内容或根本没有文件? –
如果你不设置'shell = True',比如'proc = subprocess.Popen(['ifconfig','-a','eth0'],stdout = subprocess.PIPE)''是否有区别? –
输出被发送到远程数据库,并且当它从终端运行时,我可以读取数据。虽然如果我使用'shell = False'我得到这个错误'OSError:[Errno 2]没有这样的文件或目录' – user3734366