打包并克隆一个 Python venv

Package and clone a Python venv

我敢肯定这个问题被问了很多,但我自己也在努力寻找答案。使用 virtualenv 时似乎有很多,但 venv 几乎没有。

我创建了一个程序 运行,混合了 Python 和 Powershell,我希望能够将其安装在其他 Windows 机器上。为此,我需要复制 venv.

一个解决方案就是在每台机器上创建一个新的 venv 并 pip 安装要求。然而,一旦有人拥有更新版本的 Python,这就会失败,因为在 Windows 机器上创建 venv 时无法指定版本。

我试过简单地复制我的 inno 安装包中的 venv,然后 pip 安装到其中,但这不起作用。 venv 的设置仍然与原始机器匹配,因此在不同位置时会失败。然后它会将所有软件包安装到默认 python 位置。

我试了一下 venv-pack,但没用。

希望有解决方案。我看过 pyinstaller,但它似乎完全依赖于程序 python,而我的不是。

谢谢!

////////////////////////// 更新 //////////////// ////////////

我实际上已经能够通过更改 venv 文件中的几行来复制粘贴 venv。如果我能弄清楚如何自动执行此操作,那么 venv 分发将非常简单。

以下文件包含 venv 的位置:

如果这三个都可以替换,那么 venv 工作正常(或者至少目前看来是这样)

好的,看起来我已经使用非常简单的代码完成了这项工作。这似乎适用于我安装它的任何机器,尽管它没有在 Python.

的多个版本的情况下进行测试

这是我所做的:

首先我创建了 python 脚本 set_dir.py 将 venv 的位置输出到 json 文件,你只需要编辑 venv 名称。这可以很容易地实现自动化,我只是还没想好:

import os
import json
venv_dir = "/YOUR_VENV_NAME"
cwd = os.getcwd()
cwd = cwd.replace("\","/")
cwd += venv_dir
dir_path = {
    "path": cwd
}
with open('path.json', 'w', encoding='utf-8') as f:
    json.dump(dir_path, f, ensure_ascii=False, indent=4)

接下来在 venv\scripts 文件夹中,我将这一行添加到 Activate 的顶部。ps1:

$Data = Get-Content -Raw "path.json" | ConvertFrom-Json

并将 $env:VIRTUAL_ENV 变量更改为:

$env:VIRTUAL_ENV=$Data.path

然后在 activate.bat 中,我将 VIRTUAL_ENV 变量编辑为以下内容:

set VIRTUAL_ENV=%cd%

现在我可以像这样使用 inno 分发我的项目了:

使用pip获取项目需求:

py -m pip freeze > requirements.txt

删除venv,新建一个同名的venv,然后复制修改后的激活文件。

将所有必需的文件添加到 inno 安装程序,并在末尾 运行 添加一个脚本以获取您的 venv 路径并安装所有必需的包。我编写了以下 PowerShell 脚本,然后使用 Win-PS2EXE 将其转换为 exe:

Set-ExecutionPolicy Unrestricted -Scope Process -Force
py .\set_dir.py
MY_VENV\scripts\activate
py -m pip install --upgrade pip
py -m pip install -r requirements.txt
exit

我会在某个时候写一些可以自动完成所有这些的东西,但现在我希望这对某人有所帮助!

这样做可能有很多错误,但目前它正在完成工作。最终它可能会导致一些灾难性的错误,但它们是我未来的自己要处理的。做他真是糟透了!