【问题标题】:Subprocess statement works in python console but not work in Serverdensity plugin?Subprocess 语句在 python 控制台中有效,但在 Serverdensity 插件中无效?
【发布时间】:2010-04-01 13:44:17
【问题描述】:

在 python 控制台中,以下语句工作得非常好(我猜这种方式使用 eval 并不是很好,但在这种情况下它只是用于测试目的,将被正确的解析替换)

$ python
>>> import subprocess
>>> r = subprocess.Popen(['/pathto/plugin1.rb'], stdout=subprocess.PIPE, close_fds=True).communicate()[0]
>>> data = eval(r)
>>> data
{'test': 1}

当我将其转换为 Serverdensity plugin 时,它会在每次执行插件时不断使 agent.py 守护进程崩溃。我能够将其缩小到子流程行,但找不到原因。异常捕获似乎也不起作用。

插件的外观如下:

class plugin1:
  def run(self):
    r = subprocess.Popen(['/pathto/plugin1.rb'], stdout=subprocess.PIPE, close_fds=True).communicate()[0]
    data = eval(r)
    return data

我对使用 python 还是很陌生,无法真正弄清楚为什么这不起作用。非常感谢您的想法:)

【问题讨论】:

    标签: python subprocess popen


    【解决方案1】:

    您在模块中导入了子流程吗?还有什么错误,您可以发布错误消息吗?

    【讨论】:

    • 不幸的是,我根本没有收到任何错误消息,只是调用插件的守护进程在没有通知的情况下崩溃(或者我不知道这个通知会出现在哪里,而不是在守护进程日志中)。下面是插件如何调用的来源:github.com/boxedice/sd-agent/blob/master/checks.py#L1167它仍然有点超出我的python知识(今天才开始做一个插件)
    【解决方案2】:

    在切换我的开发箱后(可能是因为不同的 python 版本?)我终于能够得到一些正确的错误输出。

    然后就很简单了:我真的只需要导入缺少的子流程模块。

    对解决方案感兴趣的人:

    http://github.com/maxigs/Serverdensity-Wrapper-Plugin/blob/master/ruby_plugin.py

    尚未完全准备好生产,但已经可以用于保存输入

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2018-09-13
      • 2011-03-15
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多