使用 python 在不同的 virtualenv 中运行子进程

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

假设我在 2 个不同的虚拟环境中安装了 2 个不同版本的应用程序。 myapp v1.0 和 myapp v2.0.

现在我想比较一下。比较是用 python 本身编写的。最好的方法是什么?假设我可以单独运行它们并写入一个输出文件,稍后我可以对其进行比较。

一种方法是编写一个 bash 脚本(这就是我目前所拥有的)。我激活一个 virtualenv,运行 myapp v1.0,激活另一个 virtualenv,运行 myapp v2.0。稍后对这些文件运行比较模块。但我想在那里添加一些更多的动态(采用一些可选参数等),这使用 python 会更容易。

编辑:

目前我有类似的东西(bash 脚本):

source virtualenv1/bin/activate
python my_script.py
deactivate

source virtualenv2/bin/activate
python my_other_script.py
deactivate

python my_comparison_script.py

相反,我只想做:

python my_comparison_script.py

我的脚本将在其中运行。

python virtualenv
3个回答
74
投票

其他答案之一没有解决在子进程中“激活”virtualenv 的问题。

如果您通过调用 python 可执行文件来启动应用程序,就像在您的示例中一样,它实际上非常简单:您只需显式指向 virtualenv 中的可执行文件。

import subprocess

subprocess.Popen(["virtualenv1/bin/python", "my_script.py"])
subprocess.Popen(["virtualenv2/bin/python", "my_other_script.py"])

将启动相应虚拟环境中的进程。

重要

解决评论中提出的问题:

如果您想运行子进程并确保使用当前进程正在运行的相同的解释器,则必须使用sys.executable。还可以使用: sys.exec_prefix 访问安装了平台相关 Python 文件的特定于站点的目录前缀。

如果您想更深入地讨论该主题,请查看此拉取请求


15
投票

我认为 virtualenv 文档解释得很好。

TL;博士

直接运行 python venv 二进制文件与激活 venv 相同。 您还必须相应地更改 PATHVIRTUAL_ENV 变量(查看 os.environ

来源

$ 源/路径/到/ENV/bin/activate

这将更改您的 $PATH,因此它的第一个条目是 virtualenv 的 bin/ 目录。 (你必须使用源代码,因为它会改变你的 shell 环境就位。)这就是它所做的全部;这纯粹是为了方便。

如果您直接运行脚本或Python解释器 virtualenv 的 bin/ 目录(例如 path/to/ENV/bin/pip 或 /path/to/ENV/bin/python-script.py) 那么 sys.path 将自动为 设置为使用与 virtualenv 关联的 Python 库。但, 与激活脚本不同,环境变量 PATH 和 VIRTUAL_ENV 不会被修改。这意味着如果你的Python 脚本使用例如子进程来运行另一个Python脚本(例如通过 !/usr/bin/env python shebang line) 第二个脚本可能无法使用与第一个脚本相同的 Python 二进制文件执行,也不能具有相同的 Python 二进制文件 可用的库。为了避免这种情况发生,你的第一个脚本 需要以与以下相同的方式修改环境变量 执行第二个脚本之前的激活脚本。


12
投票

一个简单的选择是使用子进程运行一系列命令,如下所示(请注意,

shell=True
有风险,只有在可以控制输入时才应使用)。

import subprocess
    
cmd = 'source activate my_virtualenv; python my_script.py'
subprocess.call(cmd, shell=True, executable='/bin/bash')

并根据需要重复。

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