【问题标题】:Subprocess.check_output fails with exit status -15Subprocess.check_output 失败,退出状态为 -15
【发布时间】:2018-09-12 06:29:03
【问题描述】:
subprocess.check_output('lspci | egrep  -i "virtio network" | wc -l', shell=True)

退出状态为 -15 失败。发生这种情况的可能情况是什么?

CalledProcessError: Command 'lspci | egrep  -i "virtio network" | wc -l' returned non-zero exit status -15

我读到了退出状态 1,但代码 -15 背后的具体含义是什么。

【问题讨论】:

  • 你能在命令行中运行它吗?尝试在命令行中运行它并执行 $ echo $?在它之后查看返回值,看看是否相同。
  • 您的命令在 Ubuntu 18 (Python3) 中运行良好。发生错误的环境是什么?
  • @Hannu 这是不可重现的。它发生在生产环境中。虚拟机在 GCP 上。

标签: python subprocess


【解决方案1】:

如果子进程在收到SIGTERM(即15)后死亡,您会在 python 2 中看到这一点。由于您使用了shell=True,这意味着包装您的呼叫的/bin/sh 进程被(接收到的信号)SIGTERM(并终止)杀死。

Python 3 的输出对于在这种情况下提示原因可能会更有帮助:

subprocess.CalledProcessError: Command 'lspci | egrep  -i "virtio network" | wc -l' died with <Signals.SIGTERM: 15>.

看着你的线:

subprocess.check_output('lspci | egrep  -i "virtio network" | wc -l', shell=True)

也许试试这个是有意义的:

len([l for l
     in subprocess.check_output('lspci').lower().splitlines()
     if b"virtio network" in l])

它不是将调用包装在 shell 实例中并分叉多个进程以获取具有特定字符串的行数,而是从 lspci 检索输出,将其转换为小写(以使匹配不区分大小写,如上面的 -i ) 并在行边界上分割输出。基于这些行列表的列表理解为我们提供了所有行的结果列表,这些行仅限于包含搜索的那些行 str (或者更确切地说 bytes 对 py2/3 友好)和 len 给我们一个 int有多少这样的行。

【讨论】:

    猜你喜欢
    • 2016-02-08
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多