Debian

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

  • November 16, 2018

在以下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 (stretch) 與 Python 3.5.3 和 zsh 5.3.1

command是一個內置的 shell,所以不是文件系統中的一個自己的對象。

man bash/man zshhelp command

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

可能是一個解決方案(我沒有zsh安裝,所以我的範例bash改為使用)。

如果您使用的是 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

引用自:https://unix.stackexchange.com/questions/429400