使用以下 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 zsh
或help 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])