繁体   English   中英

打包并克隆一个 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 的位置:

  • 启用
  • 激活.bat
  • 激活.ps1

如果可以在所有三个中替换它,那么 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

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

以这种方式做事可能有很多错误,但目前它正在完成工作。 最终它可能会导致一些灾难性的错误,但它们是我未来的自己要处理的。 讨厌成为他!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM