【问题标题】:Python subprocess call hungs when running rpm2cpio运行 rpm2cpio 时 Python 子进程调用挂起
【发布时间】:2016-11-02 13:42:36
【问题描述】:

我正在运行以下命令,使用 python 子进程从 rpm 中提取文件。 但是当 rpm 大小超过 25 - 30 MB 时,该命令会失败。使用Popencall 尝试了命令,stdout 也作为PIPEos.system。当我直接在 shell 中运行此命令时,它运行良好。问题只是当我通过某种方式从 Python 调用它时

命令:

rpm2cpio <rpm_name>.rpm| cpio -idmv

我对进程 ID 进行了 strace,发现它总是挂在某个写入系统调用上

ps -ef | grep cpio
root      4699  4698  4 11:05 pts/0    00:00:00 rpm2cpio kernel-2.6.32-573.26.1.el6.x86_64.rpm
root      4700  4698  0 11:05 pts/0    00:00:00 cpio -idmv

strace -p 4699
Process 4699 attached
write(10, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0rc_pixelview_new"..., 8192

strace -p 4700
Process 4700 attached
write(2, "./lib/modules/2.6.32-573.26.1.el"..., 94

我有两个问题:

  1. 有人能找出问题所在吗?为什么 rpm 大小超过 25 MB 时会失败。
  2. 还有其他方法可以从 python 中提取 rpm 内容吗?

【问题讨论】:

  • 请贴出你使用的python代码。您是否将标准输出重定向到 PIPE,然后按照以下答案之一的建议忘记读取管道?如果没有需要调试的代码,我们无法调试它。

标签: python process rpm strace cpio


【解决方案1】:

您的输出管道已满。 python docs 注释在很多地方去做你正在做的事情:

不要将此函数与 stdout=PIPE 或 stderr=PIPE 一起使用,因为这可能会基于子进程输出量而死锁。当您需要管道时,将 Popen 与communicate() 方法一起使用。

【讨论】:

    【解决方案2】:

    如果您想要的只是 *.rpm 包的有效负载,则进行计算以找到压缩的 cpio 有效负载的开头并直接在 python 中执行操作。

    有关记录必要计算的 rpm2cpio.sh shell 脚本,请参见 How do I extract the contents of an rpm?。唯一的微妙之处是确保签名和元数据头之间的填充(对齐所需)是正确的。

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 2014-08-22
      • 2012-09-07
      • 2015-07-07
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多