在 python 子进程中找不到命令“command”

在 python 子进程中找不到命令“command”

使用以下 python 脚本中的命令command不成功:

import subprocess

subprocess.run(["command", "-v", "yes"])

并导致

Traceback (most recent call last):
  File "command_test.py", line 3, in <module>
    subprocess.run(["command", "-v", "yes"])
  File "/usr/lib/python3.5/subprocess.py", line 383, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/lib/python3.5/subprocess.py", line 676, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.5/subprocess.py", line 1282, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'command'

在 shell (zsh) 中,这按预期工作:

$ command -v yes         
/usr/bin/yes

如何command在 python 子进程中使用?我需要安装一些额外的软件包吗?

环境:

Debian 9(延伸)与 Python 3.5.3 和 zsh 5.3.1

答案1

command是 shell 的内置命令,因此不是文件系统中的自有对象。

请参阅man bash/man zshhelp command

$ python3 -c 'import subprocess ; subprocess.run(["bash","-c","command -v yes"])'
/usr/bin/yes

可能是一个解决方案(我没有zsh安装,所以我的示例使用bash)。

答案2

如果你使用的是 Python 3.5,则不需要使用command -v来获取可执行文件的路径。shutil.which()(我认为从 3.3 开始可用)。

import shutil
yes_path = shutil.which('yes')

例子:

$ python3 -c 'import shutil; print(shutil.which("yes"))'
/usr/bin/yes

答案3

import subprocess
subprocess.run(['command', executable='/bin/bash',shell=True])

相关内容