python - 从 /usr/bin/* 执行命令时来自 subprocess.run 的 FileNotFoundError - Python
问题描述
我见过很多类似subprocess
的问题,但没有一个有助于解决我的问题。
我使用Web Extensions API 为 Firefox 浏览器编写了一个插件。该插件使用Native Messaging API 与原生应用程序(本质上是一个 Python 脚本)进行通信。作为参考,我的扩展程序和本机应用程序(Python 脚本)的工作方式与此示例
类似。
在我的 Python 脚本中,我使用subprocess
模块来运行 shell 命令,如下所示:
import subprocess
completedProcess = None
try:
completedProcess = subprocess.run(['/usr/bin/dig', '+short', '@185.228.168.10', 'stackoverflow.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
中找不到程序。/usr/bin
whereis echo
/bin/echo
奇怪的是,回溯提到但在我的系统上/usr/lib/python3.5
我没有 directory ,python3.5
尽管我在.python3
python3.6
python3.7
/usr/lib
请帮助我找到潜在的问题并解决它。任何帮助是极大的赞赏。如果您需要更多调试信息,我很乐意提供。
解决方案
经过故障排除后,我发现问题与 Python 或其子进程模块无关,但实际上是由于 Firefox在 Ubuntu 中作为snap包安装。我对 snap 包了解不多,但它们为已安装的应用程序提供了有限的环境。
因此,本机应用程序(Python 脚本)是通过扩展程序或 Firefox snap 在该受限环境中启动的,并且无法找到系统程序。此外,Python 回溯提到 Python3.5 是因为脚本是由 Python 的 snap 包版本/snap/core/current/usr/bin/python3
而不是系统全局 Python 解释的。我猜 snap 包的等效目录是snap/core/current/bin/
和/snap/core/current/usr/bin/
. 此外,您不能修改 snap 目录,因此dig
不能被复制过来。
可能存在替代解决方案,但我决定从 Mozilla 官方网站删除 Firefox snap 并重新安装 Firefox 作为常规程序。现在,一切正常。
推荐阅读
- git - 将 SVN 存储库移动到 Git,其中不同的分支具有不同的外部,它们共享相同的外部本地目录名称
- ag-grid - 通过拖动和行分组根据行数据使 rowDrag 有条件
- neo4j - 如何从 CE 版本中删除 NEO4J
- javascript - 正则表达式匹配双引号内的每个字符串并包含转义引号
- android - ScrollView 内的指南 - 使用 Viewport %
- reactjs - 为什么在 Next.js 中使用 Link 时会重新加载页面?
- openssl - TLS1.3 OpenSSL tls alert unrecognized_name do not appear
- c - CMake 构建可执行文件时未定义和重复的符号。Fortran77 C 混合
- mysql - Dart Angular 和 mySql
- javascript - React:main.js 和 index.js 基本一样吗?