首先,我尽可能多地向subprocess.check_output()阅读相关问题,但仍难以找出问题。
如果我在shell中执行kill -l 1
,我会得到1的相应信号名称,即HUP
。我在python脚本中需要相同的行为,所以我使用:
>>> subprocess.check_output(['kill', '-l', '1'])
b'HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT\nCHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS\n'
子进程似乎忽略了参数列表中的“1”,而是执行kill -l
。
我尝试了不同的版本,参数作为列表或字符串,shell选项为True和False,但似乎都没有。
任何想法可能是什么原因?在Ubuntu14.04上使用python3.4。
谢谢!
答案 0 :(得分:2)
可能的原因:shell中的kill
命令正在执行内置的shell(大多数shell都有一个,因为当你有失控的fork炸弹等时你需要能够在没有进程启动的情况下杀死它) ),而check_output
(默认情况下不在shell中执行)正在运行kill
中的PATH
可执行文件(通常为/bin/kill
,但并非总是如此,正在运行{{1}在type -P kill
中将告诉您可执行文件的位置。
可能性是,内置支持您正在寻找的交换机,可执行文件不支持。在bash
中,尝试运行bash
,然后显式运行type -P kill
以查看/full/path/to/kill -l 1
kill
是否真正支持该调用。通常check_output
的不同实现之间存在细微差别。
对此最好的解决方案可能是避免昂贵且毫无意义的kill
启动,并检查信号的Python定义。例如,在Python 3.5中,构建从Python已知的信号到Python名称的映射是微不足道的:
subprocess
在较旧的Python中,名称不是import signal
sigdict = {sig.value: sig.name for sig in signal.Signals}
print(sigdict[1])
CTRL_BREAK_EVENT # <-- The output on my Windows box. On your machine, it would probably be SIGHUP
,您可以使用模块的enum
使用类似的代码,过滤dir
为__module__
的名称并且其值是整数来构造映射。