在PyInstaller中打包多个脚本


问题内容

我正在使用PyInstaller将两个脚本转换为一个可执行文件,其中一个调用另一个。我遇到的问题是我无法弄清楚如何捆绑这两个脚本,仍然让它们彼此引用:

导致此问题的代码是一个脚本script1.py包含:

subprocess.call(['gksudo','python script2.py'])

当我正常运行脚本时,这可以很好地工作,但是一旦将它们打包在PyInstaller中,我便不知道如何使调用正常进行。


问题答案:

我不认为pyinstaller可以独自处理这种捆绑,至少我没有设法进行配置。我也有一个相当大的应用程序,其中有些调用

subprocess.Popen(’python’…)

完成。我最终使其工作的方式是:

  1. 将子流程调用修改为其他python,例如subprocess.call(['gksudo','./python script2.py'])。在您的情况下,请创建两个单独的分析,一个用于入口点,另一个用于其余脚本:

a1-对script1.py的分析a2-对script2.py的分析

  1. 仅从入口点脚本创建exe:

    pyz = PYZ(a1.pure)
    

    exe = EXE(pyz,
    a1.scripts,
    exclude_binaries=1,
    name={name here},
    debug=False,
    strip=False,
    upx=True,
    console=1 )


  2. 从所有脚本收集

        coll = COLLECT( exe,
       a1.binaries,
       a1.zipfiles,
       a1.datas,
       a2.binaries,
       a2.zipfiles,
       a2.datas,
    

    python_tree,
    *additional_trees,
    strip=False,
    upx=True,
    name={})

  3. 将python复制到所有子进程调用中指定的位置的发行版中,并安装pyinstaller找不到的任何其他要求(我有一些类似matplotlib,pylab等)

  4. 创建一个启动脚本,该脚本首先更改所有必需的环境变量以指向您的程序包,然后启动该应用程序。就我而言,需要的是从调用目录:

     export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
    

    export LD_RUN_PATH=pwd:$LD_RUN_PATH

现在,如果我希望该应用程序在未安装python的计算机上运行,​​或者如果它们已安装python的计算机上运行,​​则所有这些都是必需的,请确保该应用程序仍使用分发包中的所有库而不是任何本地库。如果在您的情况下,python已经安装在目标计算机上,那么我认为不需要这样做,前三步就足够了。