【问题标题】:Python: get stdout from background subprocessPython:从后台子进程获取标准输出
【发布时间】:2017-08-01 08:19:14
【问题描述】:

我正在尝试使用 python 脚本获取 linux 机器上的网络接口信息,即“ifconfig -a eht0”。所以我使用以下代码:

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 &

它工作正常,但是当它在没有活动 shell 的情况下从后台运行(由 crontab 启动)时,我无法获得输出。

有什么想法吗?

谢谢

【问题讨论】:

  • 您如何处理output 以查看它是否有效(无论是在后台还是在活动外壳中)?您是否将其保存到文件中?如果是这样,文件是否被创建但没有内容或根本没有文件?
  • 如果不设置shell=True,比如proc = subprocess.Popen(['ifconfig', '-a', 'eth0'], stdout=subprocess.PIPE),会有区别吗?
  • 输出被发送到远程数据库,当它从终端运行时,我可以读取数据。如果我使用shell=False,我会收到此错误OSError: [Errno 2] No such file or directory
  • 如果您不使用shell=True,您必须将命令行作为列表传递,如我之前的评论所示。
  • @PM2Ring 我已经使用列表来传递命令,它引发了这个异常[Errno 2] No such file or directory

标签: python linux shell background subprocess


【解决方案1】:

你试过用“屏幕”吗?

proc = subprocess.Popen('screen ifconfig -a eth0', shell=True, stdout=subprocess.PIPE)

我不确定它是否可以工作。

【讨论】:

  • 如果你不确定它应该是评论,而不是答案
  • 所以声望低于 50 的用户不能评论其他人的帖子。
  • 是的,我不能发表评论。我以前遇到过同样的问题。该解决方案对我有用。但我不确定它是否适用于其他人
【解决方案2】:

尝试 proc.stdout.readline() 而不是通信,stderr=subprocess.STDOUT 中的 subprocess.Popen() 可能会有所帮助。请发布结果。

【讨论】:

  • 从终端启动脚本会给出eth0 Link encap:Ethernet HWaddr 18:b2:23:a4:12:1e 而不是完整的输出,如果由 cron 运行,它会再次给出空字符串。
  • 我建议你使用 proc.communicate 。您是否尝试过使用 2>&1 将标准错误重定向到输出?
  • 另外,尝试从 crontab 调用脚本并在调用脚本的行重定向输出(可能相关,我不是强大的 crontab 用户link
【解决方案3】:

我找到了问题的解决方案,我猜系统在 crontab 执行时无法识别函数ifconfig。所以添加子进程的完整路径可以让脚本正确执行:

`proc = subprocess.Popen('/sbin/ifconfig -a eth0',shell=True,stdout=subprocess.PIPE)
 proc.wait()
 output = proc.communicate()[0]`

现在我可以管理输出字符串了。

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-03
    • 2016-11-17
    • 2017-03-28
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    相关资源
    最近更新 更多