Я видел много похожих 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
.
Пожалуйста, помогите мне найти основную проблему и устранить ее. Любая помощь очень ценится. Если вам нужна дополнительная отладочная информация, я с радостью предоставлю.