在PyInstaller中打包多个脚本
问题内容:
我正在使用PyInstaller将两个脚本转换为一个可执行文件,其中一个调用另一个。我遇到的问题是我无法弄清楚如何捆绑这两个脚本,仍然让它们彼此引用:
导致此问题的代码是一个脚本script1.py
包含:
subprocess.call(['gksudo','python script2.py'])
当我正常运行脚本时,这可以很好地工作,但是一旦将它们打包在PyInstaller中,我便不知道如何使调用正常进行。
问题答案:
我不认为pyinstaller可以独自处理这种捆绑,至少我没有设法进行配置。我也有一个相当大的应用程序,其中有些调用
subprocess.Popen(’python’…)
完成。我最终使其工作的方式是:
- 将子流程调用修改为其他python,例如
subprocess.call(['gksudo','./python script2.py'])
。在您的情况下,请创建两个单独的分析,一个用于入口点,另一个用于其余脚本:
a1-对script1.py的分析a2-对script2.py的分析
-
仅从入口点脚本创建exe:
pyz = PYZ(a1.pure)
exe = EXE(pyz,
a1.scripts,
exclude_binaries=1,
name={name here},
debug=False,
strip=False,
upx=True,
console=1 ) -
从所有脚本收集
coll = COLLECT( exe, a1.binaries, a1.zipfiles, a1.datas, a2.binaries, a2.zipfiles, a2.datas,
python_tree,
*additional_trees,
strip=False,
upx=True,
name={}) -
将python复制到所有子进程调用中指定的位置的发行版中,并安装pyinstaller找不到的任何其他要求(我有一些类似matplotlib,pylab等)
-
创建一个启动脚本,该脚本首先更改所有必需的环境变量以指向您的程序包,然后启动该应用程序。就我而言,需要的是从调用目录:
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
export LD_RUN_PATH=
pwd
:$LD_RUN_PATH
现在,如果我希望该应用程序在未安装python的计算机上运行,或者如果它们已安装python的计算机上运行,则所有这些都是必需的,请确保该应用程序仍使用分发包中的所有库而不是任何本地库。如果在您的情况下,python已经安装在目标计算机上,那么我认为不需要这样做,前三步就足够了。