我有一个脚本,foo,它可以更改 pyenv 虚拟环境并运行 python 程序。
#!/bin/bash
pyenv activate my_env
python main.py
我通过
调用脚本. foo
或者,等价
source foo
它改变了 virtualenv 并且完美运行。
我现在想从 python 程序调用脚本。我已经研究了这个问题的答案中给出的解决方案,我的编码看起来像这样
import os
import subprocess
def main() -> None:
script_path = 'scripts/foo'
shell_source(script_path)
def shell_source(script):
pipe = subprocess.Popen(
". %s && env -0" % script,
stdout=subprocess.PIPE,
shell=True
)
output = pipe.communicate()[0].decode('utf-8')
output = output[:-1]
env = {}
for line in output.split('\x00'):
line = line.split('=', 1)
env[line[0]] = line[1]
os.environ.update(env)
if __name__ == '__main__':
main()
但是当我运行程序时出现错误
激活 virtualenv 失败。 也许 pyenv-virtualenv 尚未正确加载到您的 shell 中。 请重新启动当前 shell 并重试。
我该怎么办?
我现在意识到这个问题的措辞不正确;应该说
如何从 bash 脚本在 virtualenv 中运行 Python 程序
解决方案是不要用裸python调用程序;例如
python main.py
但要从 virtualenv 中的 python 版本调用它;例如
~/.pyenv/versions//my_env/bin/python main.py
并从脚本中删除行 pyenv activate my_env