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
并尝试在 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)