Python subprocess.check_output()似乎忽略了参数

时间:2015-10-28 20:36:22

标签: python shell subprocess

首先,我尽可能多地向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。

谢谢!

1 个答案:

答案 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__的名称并且其值是整数来构造映射。