+ 编程

Python 制作项目的整合包(Windows)
2023-11-23

目录:

最近,模型盛行,在体验模型的时候,经常看到一些整合包方案。这让我产生好奇,如何在脱离全局 Python 环境下的条件下运行项目,它们又是怎么运行的。在一段时间的探索之后,我想是时候记录一下心得了。

使用虚拟环境方案-猜想

首先,在 Window 中运行 Python 项目,运行环境必不可少。我首先想到的是 Python 的虚拟环境,因此,我创建了一个虚拟环境,将所有包安装,我直接编写了 .bat 通过启动虚拟环境。

@echo off
call ".\venv\Scripts\activate"
build.py

恩,运行成功。这样就完成了吗?

否。正当我将它移动到其他目录准备做下一阶段工作时,再次运行发现,虚拟环境无法识别。

发生了什么?我猜测是路径错误,检查了虚拟环境文件后找到下面几个的文件

  • Script/active
  • Script/active.sh
  • pyvenv.cfg

我在这些目录中发现,虚拟环境中使用的全部是绝对路径,也就是说一旦将项目移动,虚拟环境就会被破坏。

我试着把其中的绝对路径都替换成相对路径或移动后的目录路径,但是都失败了,或许我遗漏了一些文件的修改,但这不是重点。

从结果来看这个方案失败了(虚拟环境并不灵活),继续探索也没有价值,也许我应该换一种方案。

使用 Python 安装文件-正解

我翻出前不久下载的整合包,仔细观察了文件结构,让我意外的是,它直接复制了一份全局的 Python 环境文件到项目的 python 文件中(嗯,简单粗暴)。

直接从项目中指定 Python 的运行环境,和虚拟环境类似。但好处是,移动目录也不会破坏执行环境,只要指定相对路径就行。

为了考证这个猜想,我查看了用于启动的 .bat 文件,果然,第一行写的就是 Python 环境的相对路径,后面紧接着运行文件和可选参数

python\python.exe …

看来是我把问题想的复杂了,参考着这个方法我同样把自己全局环境中的 Python 文件复制一份,再把虚拟环境中的包迁移过去,并且编写 run.bat 文件,很顺利的运行了 build.py 测试文件

run.bat

python\python.exe build.py –args=args

参数传递

项目运行的模型,大部分都有提供用于微调的参数,那么,从 .bat 传入的参数如何接收呢?

可用通过导入 sys 包下的 sys.argv 获取参数列表

import sys

args = sys.argv[1:]

其中 sys.argv[0] 是脚本的名称,因此我们需要对它进行切片处理

使用第三方包支持

在我将第三方包导入后,产生错误:ImportError: No module named xxx

这个问题在全局环境中也存在,不过起初我没有深究。查阅资料后发现, Python 解释器在执行 .py 文件时,只会在其目录之下搜索包。

解决方法也很简单,在执行开始的时候把项目的绝对路径添加到 Python 解释器的搜索路径中既可

import os
import sys

curPath = os.path.abspath(os.path.dirname(__file__))
sys.path.append(curPath)

重新运行测试,成功执行。

包管理

直接在项目中安装会被指定到全局运行环境,而不是项目运行环境。

要将包安装到项目环境,有三种方法

  1. 在 PyCharm 中指定解释器为项目环境,导入包
  2. 在 PyCharm 终端中使用 cd python 进入到 python.exe 文件的所在目录,使用 python -m pip install 导入包
  3. 在 Shell 中使用进入到 python.exe 文件的所在目录,使用 ./python -m pip install 导入包

后语

至此,我们学会了如何创建 Python 项目的整合包,如果遇到有趣的项目,就可以通过这种方式迁移,或者分享给其他人。

除此之外,还可以将项目打包成 exe 文件,这也许是解决虚拟环境不灵活的一种方案。不过,缺点是不方便 Git 拉取项目更新。

本文作者: Exisi 本文链接: 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。