gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:23:43 27 4
gpt4 key购买 nike

首先,我阅读了尽可能多的与 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。

谢谢!

最佳答案

可能的原因:shell 中的 kill 命令正在执行内置的 shell(大多数 shell 都有一个,因为当您有失控的 fork 炸弹时,您需要能够在不启动进程的情况下杀死等),而 check_output (默认情况下不在 shell 中执行)正在运行 PATH 中找到的 kill 可执行文件(通常是 /bin/kill,但并非总是如此,在 bash 中运行 type -P Kill 会告诉您该可执行文件在哪里)。

很可能,内置支持您正在寻找的开关,而可执行文件则不支持。在 bash 中,尝试运行 type -P kill,然后显式运行 /full/path/to/kill -l 1 以查看是否kill check_output 发现实际上支持该调用。 kill 的不同实现之间通常存在细微差别。

对此问题的最佳解决方案可能是避免昂贵且无意义的 subprocess 启动并检查信号的 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

在旧版 Python 中,名称不是 enum,您可以使用模块的 dir 来使用类似的代码,过滤其 __module__signal ,其值是构造映射的整数。

关于Python subprocess.check_output() 似乎忽略参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33401142/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com