【问题标题】:Packaging multiple scripts in PyInstaller在 PyInstaller 中打包多个脚本
【发布时间】:2012-02-11 21:55:54
【问题描述】:
我正在使用 PyInstaller 将两个脚本转换为一个可执行文件,其中一个调用另一个。我遇到的问题是我无法弄清楚如何捆绑这两个脚本并仍然让它们相互引用:
导致问题的代码是一个脚本,script1.py 包含:
subprocess.call(['gksudo','python script2.py'])
当我正常运行脚本时,这工作正常,但是一旦它们被打包到 PyInstaller 中,我不知道如何使调用工作。
【问题讨论】:
标签:
python
executable
pyinstaller
gksudo
【解决方案1】:
我不认为 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
-
创建一个启动脚本,首先将所有必需的环境变量更改为指向您的包,然后启动应用程序。在我的情况下,需要的是,来自调用目录:
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
export LD_RUN_PATH=`pwd`:$LD_RUN_PATH
如果我希望应用程序在没有安装 python 或安装了 python 的机器上运行,那么现在所有这些都是必需的,请确保应用程序仍然使用分发包中的所有库而不是任何本地库.如果在您的情况下,python 已经安装在目标机器上,我认为没有必要这样做,前 3 个步骤就足够了。