最近,模型盛行,在体验模型的时候,经常看到一些整合包方案。这让我产生好奇,如何在脱离全局 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 获取参数列表
其中 sys.argv[0] 是脚本的名称,因此我们需要对它进行切片处理
使用第三方包支持
在我将第三方包导入后,产生错误:ImportError: No module named xxx
。
这个问题在全局环境中也存在,不过起初我没有深究。查阅资料后发现, Python 解释器在执行 .py 文件时,只会在其目录之下搜索包。
解决方法也很简单,在执行开始的时候把项目的绝对路径添加到 Python 解释器的搜索路径中既可
重新运行测试,成功执行。
包管理
直接在项目中安装会被指定到全局运行环境,而不是项目运行环境。
要将包安装到项目环境,有三种方法
- 在 PyCharm 中指定解释器为项目环境,导入包
- 在 PyCharm 终端中使用
cd python
进入到python.exe
文件的所在目录,使用python -m pip install
导入包 - 在 Shell 中使用进入到
python.exe
文件的所在目录,使用./python -m pip install
导入包
后语
至此,我们学会了如何创建 Python 项目的整合包,如果遇到有趣的项目,就可以通过这种方式迁移,或者分享给其他人。
除此之外,还可以将项目打包成 exe 文件,这也许是解决虚拟环境不灵活的一种方案。不过,缺点是不方便 Git 拉取项目更新。