首页 > 解决方案 > 从 /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/binwhereis echo/bin/echo

奇怪的是,回溯提到但在我的系统上/usr/lib/python3.5我没有 directory ,python3.5尽管我在.python3python3.6python3.7/usr/lib

请帮助我找到潜在的问题并解决它。任何帮助是极大的赞赏。如果您需要更多调试信息,我很乐意提供。

标签: pythonpython-3.xsubprocessfirefox-addon-webextensions

解决方案


经过故障排除后,我发现问题与 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 作为常规程序。现在,一切正常。


推荐阅读