问题:
最近在做一个项目某功能模块的开发集成,该功能模块基于强化学习开发,需要在我的一个名为 tensorflow
的 Anaconda 环境中(python版本3.5.2)运行,conda activate tensorflow
用于命令行终端中激活该环境,以便可以在该环境中运行与 TensorFlow 相关的 Python 脚本或程序,编程语言使用的python。现在为了拓展该模块的功能需要集成一个插件,该插件在python3.9.7环境下可以正常运行,但是在我的Anaconda环境中(tensorflow,python版本3.5.2)会出现下面报错:
该插件在base,python版本3.9.7环境下正常运行时的输出:
解决办法:
一、原理
将插件与其所需依赖关系打包成可执行文件,然后在功能模块集成时再调用该可执行文件,就不会再报错了。
二、解决过程
(一)安装Pyinstaller模块,然后输入pyinstaller --onefile fg.py将fg.py插件脚本打包成可执行文件。
(二)编写原功能模块中的代码对插件的可执行文件进行调用,这里我新建diyfg.py脚本编写函数调用代码,需要用到subprocess和sys模块,其中subprocess.run通过可执行文件位置的参数和传递的参数直接运行该可执行文件,sys.argv将运行diyfg.py脚本的参数传递给可执行文件。
(三)在base环境中运行程序进行测试,这里我是编写一个diyfg.py脚本模拟原功能模块来调用插件的可执行文件,并顺利通过了base(python3.9.7)和tensorflow(python3.5.2)两个环境的测试,证明方法可行。
pyinstaller方法缺陷:
pyinstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件。
好处就是在运行者的机器上不用安装python和你的脚本依赖的库。
pyinstaller打包的执行文件,只能在和打包机器系统同样的环境下。也就是说,不具备可移植性,若需要在不同系统上运行,就必须针对该平台进行打包。