执行来自 /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/binwhereis echo 的程序

奇怪的是,回溯提到 /usr/lib/python3.5 但在我的系统上我没有目录 python3.5,尽管我有 python3python3.6python3.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 作为常规程序重新安装。现在,一切正常。