python:subprocess.Popen,openvpn命令未找到

时间:2018-08-28 01:17:02

标签: python path subprocess jupyter

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:命令未找到

我尝试过的事情:

  • 在我的〜/ .bash_profile中添加了export PATH="/usr/local/sbin:$PATH",并可以从我的终端上运行sudo openvpn命令
  • 编辑了我的sudoers文件,使sudo不再提示输入密码
  • 调用了sudo which openvpn,并尝试将/usr/local/sbin/openvpn添加到python中的sys.path
  • 不拆分vpn_cmd并设置shell=True
  • 试图将其包装在test.py脚本中并从终端执行,但它只是挂在proc.communicate()行上
  • 指定了--config--ca标志的完整路径

到目前为止,没有任何东西可以解决这个问题。我可以在终端上运行openvpn了。似乎是一个简单的路径问题,但我无法弄清楚需要添加到python路径中的内容。 jupyter笔记本内核有什么特别之处吗?

1 个答案:

答案 0 :(得分:0)

Jupyter可能不会选择您的个人.bashrc设置,这还取决于您如何运行它。只需对路径进行硬编码或在Python脚本中增加PATH

使用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)