python:子进程.Popen,找不到 openvpn 命令



OS X 10.13.6Python 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并尝试在 Python 中将/usr/local/sbin/openvpn添加到我的 sys.path 中
  • 不拆分vpn_cmd和设置shell=True
  • 尝试将其打包为 test.py 脚本并从终端执行,但它只是挂在proc.communicate()
  • 指定了--config--ca标志的完整路径

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

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

使用shell=False你不会扩展波浪号;所以你应该把它们更改为os.environ["HOME"],或者确保你知道你在哪个目录中运行它,并使用相对路径。

如果run可以做你需要的事情,你不应该使用Popen()

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)

相关内容

  • 没有找到相关文章

最新更新