【发布时间】:2010-02-05 10:05:27
【问题描述】:
我过去一直在成功使用subprocess.Popen,在使用 python 脚本包装二进制文件以格式化参数/自定义等时...
开发第 n 个包装器,我照常进行...但没有任何反应。
这是小代码:
print command
p = subprocess.Popen(command, shell = True)
result = p.communicate()[0]
print vars(p)
return result
这是输出:
/usr/bin/sh /tmp/run/launch.sh
{'_child_created': True, 'returncode': 0, 'stdout': None, 'stdin': None, 'pid': 21650, 'stderr': None, 'universal_newlines': False}
如您所见,目标是创建一个 shell 脚本来设置我需要的所有内容,然后执行它。我更喜欢使用真正的python代码,但不幸的是launch.sh调用了我不想尝试和复制的第3方shell脚本(尽管我已经坚持使用python api一年多了)。
问题是:
- shell 脚本未执行(它应该产生进程并输出一些小东西)
- 没有引发 python 异常
-
p对象中没有任何内容表明发生了错误
我试过check_call也没有成功...
我不知道该怎么做,如果有人能指出我的错误或指导我解决问题,我会非常高兴......
编辑:
- 尝试在 Linux (sh) 上运行它
- shell 是调用脚本中的变量替换所必需的
编辑 2:
根据badp 的建议,我调整了代码并添加了
subprocess.Popen('ps', shell = True).communicate()
在创建进程的p = ... 行之后,输出如下:
/usr/bin/sh /tmp/run/launch.sh
PID TTY TIME CMD
29978 pts/0 00:00:01 zsh
1178 pts/0 00:00:01 python
1180 pts/0 00:00:00 sh <defunct>
1181 pts/0 00:00:00 ps
None
显然进程已启动(即使<defunct>),还应注意我在传递参数时遇到了一点问题......
谢谢。
【问题讨论】:
-
你确定脚本实际上没有启动吗?您可以在拨打
Popen后立即尝试在/proc/child-pid-goes-here/上拨打stat来检查这一点 -
command的值是多少?
-
值在输出
/usr/bin/sh /tmp/run/launch.sh的开头打印 -
目前我有一个非常简单的解决方法:我在
launch.sh文件的开头添加了#!/usr/bin/sh,并将命令替换为/tmp/run/launch.sh。这行得通。如果我也使用shell = True,难道我不应该明确声明sh ...?
标签: python subprocess