FileNotFoundError из subprocess.run при выполнении команды из / usr / bin / * - Python - PullRequest
1 голос
/ 08 ноября 2019

Я видел много похожих subprocess вопросов, но ни один из них не помог в решении моей проблемы.

Я написал дополнение для браузера Firefox с использованием Web Extensions API,Это дополнение использует Native Messaging API для связи с собственным приложением (которое по сути является скриптом Python).
Для справки, мое расширение и собственное приложение (скрипт Python) работает аналогично this пример.

В моем скрипте Python я использую модуль subprocess для запуска команды оболочки, как показано ниже:

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'

IМы пытались объединить элементы списка в одну строку и установить 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, но в моей системе нет каталога python3.5, хотя у меня есть python3, python3.6, python3.7 и т. д. в пределах /usr/lib.

Пожалуйста, помогите мне найти основную проблему и устранить ее. Любая помощь очень ценится. Если вам нужна дополнительная отладочная информация, я с радостью предоставлю.

1 Ответ

1 голос
/ 12 ноября 2019

После устранения неполадок я обнаружил, что эта проблема не связана с Python или его модулем подпроцесса, но на самом деле это было связано с тем, что Firefox был установлен как пакет snap в Ubuntu. Я не знаю много о пакетах моментальных снимков, но они предоставляют ограниченную среду для установленного приложения.
Итак, собственное приложение (скрипт Python) запускается расширением или привязкой Firefox в этой ограниченной среде и не может найти системные программы. Кроме того, упоминание о трассировке Python для Python3.5 было связано с тем, что скрипт интерпретировался в пакетной версии Python в /snap/core/current/usr/bin/python3 вместо системного глобального Python. Я предполагаю, что эквивалентные каталоги для пакетов моментальных снимков - snap/core/current/bin/ и /snap/core/current/usr/bin/. Кроме того, вам не разрешено изменять каталоги моментальных снимков, поэтому dig не может быть скопировано.

Возможно, существуют альтернативные решения, но я решил удалить Firefox snap и переустановить Firefox как обычную программу с официального сайта Mozilla. Теперь все работает нормально, как и ожидалось.

...