python: subprocess.Popen, команда openvpn не найдена - PullRequest
0 голосов
/ 28 августа 2018

OS X 10.13.6 Python 3.6

Я пытаюсь выполнить следующую команду из записной книжки Jupyter:

vpn_cmd = '''
sudo openvpn 
--config ~/Downloads/configs/ipvanish-US-Chicago-chi-a49.ovpn 
--ca ~/Downloads/configs/ca.ipvanish.com.crt'''

proc = Popen(vpn_cmd.split(), stdout=PIPE, stderr=STDOUT)
stdout, stderr = proc.communicate()
print(stdout.decode())

Но получите ошибку:

sudo: openvpn: команда не найдена

Что я пробовал:

  • добавил export PATH="/usr/local/sbin:$PATH" в мой ~ / .bash_profile и может запустить команду sudo openvpn с моего терминала
  • отредактировал файл sudoers, поэтому sudo больше не запрашивает пароль
  • позвонил sudo which openvpn и попытался добавить /usr/local/sbin/openvpn к моему sys.path в python
  • не расщепляется vpn_cmd и устанавливается shell=True
  • попытался упаковать его в скрипт test.py и выполнить из терминала, но он просто зависает в строке proc.communicate()
  • указан полный путь для флагов --config и --ca

Пока ничего не исправлено. Я могу запустить openvpn из моего терминала просто отлично. Это кажется простой проблемой пути, но я не могу понять, что мне нужно добавить к моему пути Python. Что-то особенное в ядре ноутбука jupyter?

1 Ответ

0 голосов
/ 28 августа 2018

Jupyter, вероятно, не подбирает ваши персональные настройки .bashrc, в зависимости также от того, как вы его используете. Просто зашифруйте путь или увеличьте PATH в вашем скрипте Python.

С shell=False вы не получите развернутые тильды; поэтому вам следует изменить их на os.environ["HOME"] или убедиться, что вы знаете, в каком каталоге вы их запускаете, и использовать относительные пути.

Вы не должны использовать Popen(), если run может делать то, что вам нужно.

home = os.environ["HOME"]
r = subprocess.run(
    ['sudo', '/usr/local/sbin/openvpn', 
     '--config',  home + '/Downloads/configs/ipvanish-US-Chicago-chi-a49.ovpn', 
     '--ca', home + '/Downloads/configs/ca.ipvanish.com.crt'],
    stdout=PIPE, stderr=PIPE, universal_newlines=True)
print(r.stdout)
...