从Python程序调用脚本时更改Python虚拟环境

问题描述 投票:0回答:1

我有一个脚本,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 并重试。

我该怎么办?

shell pyenv
1个回答
0
投票

我现在意识到这个问题的措辞不正确;应该说

如何从 bash 脚本在 virtualenv 中运行 Python 程序

解决方案是不要用裸python调用程序;例如

python main.py

但要从 virtualenv 中的 python 版本调用它;例如

~/.pyenv/versions//my_env/bin/python main.py
并从脚本中删除行 

pyenv activate my_env

© www.soinside.com 2019 - 2024. All rights reserved.