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

Python subprocess.check_output()似乎忽略了参数,python,shell,subprocess,Python,Shell,Subprocess,首先,我阅读了尽可能多的与subprocess.check_output()相关的问题,但仍然难以确定问题所在 如果我在shell中执行kill-l1,我会得到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 S

首先,我阅读了尽可能多的与subprocess.check_output()相关的问题,但仍然难以确定问题所在

如果我在shell中执行
kill-l1
,我会得到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 optione为True和False,但似乎都不起作用

你知道原因是什么吗?在Ubuntu14.04上使用python3.4


谢谢

可能原因:shell中的
kill
命令正在执行一个shell内置命令(大多数shell都有一个,因为当您有失控的叉形炸弹等时,您需要能够在不启动进程的情况下进行kill),而
检查输出
(默认情况下不在shell中执行)正在运行在
路径中找到的
kill
可执行文件(通常
/bin/kill
,但并不总是,在
bash
中运行
type-P kill
会告诉您可执行文件的位置)

很可能,内置支持您正在寻找的交换机,而可执行文件不支持。在
bash
中,尝试运行
type-P kill
,然后显式运行
/full/path/to/kill-l 1
,查看
kill
检查输出是否实际支持该调用。通常,
kill
的不同实现之间存在细微差异

最好的解决方案可能是避免启动昂贵且毫无意义的
子流程
,并检查Python定义中的信号。例如,在Python 3.5中,构建从Python已知的信号到它们的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
导入信号
sigdict={sig.value:sig.name用于sig in signal.Signals}
打印(sigdict[1])

CTRL_BREAK_EVENT#
子进程。检查输出(['kill','-l',1'])
在我的控制台上按预期工作。-。我的linux mint上正好发生了这种情况<代码>/bin/kill-l 1
给出了
HUP INT QUIT ILL TRAP ABRT BUS FPE kill USR1 SEGV USR2管道ALRM术语STKFLT CHLD CONT STOP TSTP TTIN TUG XCU XFSZ VTALRM PROF WINCH POLL PWR SYS
@tdelaney:谢谢确认。我的旧笔记本电脑刚刚死掉,我正在一台新的笔记本电脑上,没有正常的Linux虚拟机进行测试,所以我无法确认,但这似乎是有可能的<代码>kill
在shell内置程序和可执行程序之间有一些最大的差异(我总是被可执行程序支持进程组kills通过传递
-pid
而绊倒,其中内置程序根本不支持这一点,这就是为什么我怀疑这可能是原因)。Thx,这似乎是问题所在
/bin/kill-l 1
忽略1标志,而“内置”kill提供所需的输出。有什么建议可以解决python问题吗
type-P kill
指向
/bin/kill
,内置的kill是否是我可以在某处找到的常规程序?@balint:我添加了一个替代方案,可以避免启动昂贵且无意义的子进程。如果您真的想使用内置的,您可以执行
子流程。检查\u输出('kill-l 1',shell=True)
子流程。检查\u输出(['bash','-c','kill-l 1'])
显式调用shell,然后为您运行
kill
。如果要传递的参数来自用户(漏洞的来源),这不是一个好主意,尽管在Python3.3+上可以通过使用用户提供的值来缓解这一问题。