打包并克隆Python venv

时间:2019-11-29 00:04:47

标签: python inno-setup python-venv

我确定这个问题经常被问到,但是我自己在努力寻找答案。使用virtualenv时似乎有很多东西,但venv几乎没有任何东西。

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

一种解决方案是简单地在每台计算机上创建一个新的venv并按要求安装。但是,一旦有人拥有较新的Python版本,这种情况就会消失,因为在Windows计算机上创建venv时无法指定版本。

我尝试过简单地将venv复制到我的inno install软件包中,然后将pip安装到其中,但这是行不通的。 venv的设置仍与原始计算机匹配,因此在其他位置时会掉落。然后,它将所有软件包安装到默认的python位置。

我已经给venv-pack了,但这没用。

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

谢谢!

/////////////////////////// UPDATE //////////////////// //////////

通过更改venv文件中的几行,我实际上已经能够复制venv。如果我能解决这个问题,那么venv发行将非常简单。

以下文件包含venv的位置:

  • 激活
  • activate.bat
  • Activate.ps1

如果可以全部替换掉​​这三个,那么venv可以正常工作(或者至少到目前为止看起来是这样)

1 个答案:

答案 0 :(得分:1)

好吧,看来我已经用非常简单的代码完成了这一工作。尽管没有在存在多个版本的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

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

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