执行来自 /usr/bin/* 的命令时来自 subprocess.run 的 FileNotFoundError - Python
FileNotFoundError from subprocess.run when executing command from /usr/bin/* - Python
我见过许多类似的 subprocess
问题,但其中 none 帮助解决了我的问题。
我使用 Web Extensions API. This add-on uses Native Messaging API 为 Firefox 浏览器编写了一个附加组件,用于与本机应用程序通信(本质上是一个 Python 脚本)。
作为参考,我的扩展程序和本机应用程序(Python 脚本)的工作方式与 this 示例类似。
在我的 Python 脚本中,我将 subprocess
模块用于 运行 一个 shell 命令,如下所示:
import subprocess
completedProcess = None
try:
completedProcess = subprocess.run(['/usr/bin/dig', '+short', '@185.228.168.10', 'whosebug.com'], stdout=subprocess.PIPE)
except subprocess.CalledProcessError:
pass
这 运行 在 Python REPL 中很好,我可以使用 completedProcess.stdout
访问输出,但在本机应用程序中失败(Python 脚本关联扩展名),带有以下追溯(从浏览器获取,因为本机应用程序 stderr 被重定向到浏览器控制台):
Traceback (most recent call last):
File "/home/user/Projects/sandbox/nativeapp/app/nativeapp.py", line 63, in <module>
'safe': isSafe(receivedMessage['hostname']),
File "/home/user/Projects/sandbox/nativeapp/app/nativeapp.py", line 49, in isSafe
completedProcess = subprocess.run(['/usr/bin/dig', '+short', '@185.228.168.10', hostname], stdout=subprocess.PIPE)
File "/usr/lib/python3.5/subprocess.py", line 693, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.5/subprocess.py", line 947, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child
raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: '/usr/bin/dig'
我尝试将列表元素合并为单个字符串并设置 shell=True
,也尝试用 dig
代替 /usr/bin/dig
,但没有成功。有趣的是,我可以验证 subprocess
中的回显是否正常,如:
subprocess.run(['echo', 'something'], stdout=subprocess.PIPE)
但是 subprocess
无法从我的终端报告 /bin/echo
.
中找到位于 /usr/bin
和 whereis echo
的程序
奇怪的是,回溯提到 /usr/lib/python3.5
但在我的系统上我没有目录 python3.5
,尽管我有 python3
、python3.6
、python3.7
等 /usr/lib
.
请帮我找到潜在的问题并解决它。任何帮助是极大的赞赏。如果您需要更多调试信息,我很乐意提供。
故障排除后我发现问题与 Python 或其子进程模块无关,但实际上是由于 Firefox 在 Ubuntu 中作为 snap 包安装。我不太了解 snap 包,但它们为安装的应用程序提供了受限的环境。
因此,本机应用程序(Python 脚本)在受限环境中由扩展程序或 Firefox snap 启动,无法找到系统程序。此外,Python 回溯提及 Python3.5 是因为脚本是由 /snap/core/current/usr/bin/python3
中 Python 的 snap 打包版本而不是系统全局 Python 解释的。我想 snap 包的等效目录是 snap/core/current/bin/
和 /snap/core/current/usr/bin/
。另外,您不能修改 snap 目录,因此无法复制 dig
。
可能存在替代解决方案,但我决定从 Mozilla 官方网站删除 Firefox snap 并将 Firefox 作为常规程序重新安装。现在,一切正常。
我见过许多类似的 subprocess
问题,但其中 none 帮助解决了我的问题。
我使用 Web Extensions API. This add-on uses Native Messaging API 为 Firefox 浏览器编写了一个附加组件,用于与本机应用程序通信(本质上是一个 Python 脚本)。
作为参考,我的扩展程序和本机应用程序(Python 脚本)的工作方式与 this 示例类似。
在我的 Python 脚本中,我将 subprocess
模块用于 运行 一个 shell 命令,如下所示:
import subprocess
completedProcess = None
try:
completedProcess = subprocess.run(['/usr/bin/dig', '+short', '@185.228.168.10', 'whosebug.com'], stdout=subprocess.PIPE)
except subprocess.CalledProcessError:
pass
这 运行 在 Python REPL 中很好,我可以使用 completedProcess.stdout
访问输出,但在本机应用程序中失败(Python 脚本关联扩展名),带有以下追溯(从浏览器获取,因为本机应用程序 stderr 被重定向到浏览器控制台):
Traceback (most recent call last):
File "/home/user/Projects/sandbox/nativeapp/app/nativeapp.py", line 63, in <module>
'safe': isSafe(receivedMessage['hostname']),
File "/home/user/Projects/sandbox/nativeapp/app/nativeapp.py", line 49, in isSafe
completedProcess = subprocess.run(['/usr/bin/dig', '+short', '@185.228.168.10', hostname], stdout=subprocess.PIPE)
File "/usr/lib/python3.5/subprocess.py", line 693, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.5/subprocess.py", line 947, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child
raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: '/usr/bin/dig'
我尝试将列表元素合并为单个字符串并设置 shell=True
,也尝试用 dig
代替 /usr/bin/dig
,但没有成功。有趣的是,我可以验证 subprocess
中的回显是否正常,如:
subprocess.run(['echo', 'something'], stdout=subprocess.PIPE)
但是 subprocess
无法从我的终端报告 /bin/echo
.
/usr/bin
和 whereis echo
的程序
奇怪的是,回溯提到 /usr/lib/python3.5
但在我的系统上我没有目录 python3.5
,尽管我有 python3
、python3.6
、python3.7
等 /usr/lib
.
请帮我找到潜在的问题并解决它。任何帮助是极大的赞赏。如果您需要更多调试信息,我很乐意提供。
故障排除后我发现问题与 Python 或其子进程模块无关,但实际上是由于 Firefox 在 Ubuntu 中作为 snap 包安装。我不太了解 snap 包,但它们为安装的应用程序提供了受限的环境。
因此,本机应用程序(Python 脚本)在受限环境中由扩展程序或 Firefox snap 启动,无法找到系统程序。此外,Python 回溯提及 Python3.5 是因为脚本是由 /snap/core/current/usr/bin/python3
中 Python 的 snap 打包版本而不是系统全局 Python 解释的。我想 snap 包的等效目录是 snap/core/current/bin/
和 /snap/core/current/usr/bin/
。另外,您不能修改 snap 目录,因此无法复制 dig
。
可能存在替代解决方案,但我决定从 Mozilla 官方网站删除 Firefox snap 并将 Firefox 作为常规程序重新安装。现在,一切正常。