Как добавить переменные окружения в bash, открытый модулем подпроцесса? - PullRequest
0 голосов
/ 10 января 2019

Мне нужно использовать wget в скрипте Python с функцией subprocess.call, но кажется, что команда "wget" не может быть идентифицирована подпроцессом bash, открытым python.

Я добавил переменную окружения (путь, где находится wget):

export PATH=/usr/local/bin:$PATH

к файлу ~ / .bashrc и файлу ~ / .bash_profile на моем Mac и гарантированно предоставил их. И скрипт Python выглядит так:

import subprocess as sp
cmd = 'wget'
process = sp.Popen(cmd ,stdout=sp.PIPE, stdin=sp.PIPE, 
stderr=sp.PIPE, shell=True ,executable='/bin/bash')
(stdoutdata, stderrdata) = process.communicate()
print stdoutdata, stderrdata

Ожидаемый результат должен быть как

wget: missing URL
Usage: wget [OPTION]... [URL]...

Но результат всегда

/bin/bash: wget: command not found

Интересно, что я могу получить вывод справки, если наберу wget непосредственно в терминале bash, но он никогда не работает в скрипте python. Как это могло быть?

PS:

Если я изменю команду на

cmd = '/usr/local/bin/wget'

тогда это работает. Так что я уверен, что я установил wget.

1 Ответ

0 голосов
/ 10 января 2019

Вы можете передать аргумент env= в функции subprocess.

import os

myenv = os.environ.copy
myenv['PATH'] = '/usr/local/bin:' + myenv['PATH']
subprocess.run(..., env=myenv)

Тем не менее, вы, вероятно, хотите вообще не запускать оболочку, а вместо этого увеличить PATH, который Python использует для нахождения двоичного файла для запуска в вызове подпроцесса.

import subprocess as sp
import os

os.environ['PATH'] = '/usr/local/bin:' + os.environ['PATH']
cmd = 'wget'
# use run instead of Popen
# don't needlessly use a shell
# and thus put [cmd] as a list
process = sp.run([cmd], stdout=sp.PIPE, stdin=sp.PIPE, 
stderr=sp.PIPE, 
    universal_newlines=True)
print(process.stdout, process.stderr)

Запуск команд Bash в Python объясняет внесенные мной изменения более подробно.

Однако для этого нет веской причины использовать внешнюю утилиту; Python requests делает все, что делает wget, часто более естественно и с большим контролем над тем, что именно он делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...