在PyInstaller中打包多个脚本

Par*_*ker 5 python executable pyinstaller gksudo

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

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

subprocess.call(['gksudo','python script2.py'])
Run Code Online (Sandbox Code Playgroud)

这在我正常运行脚本时工作正常,但是一旦它们被打包在PyInstaller中,我就不知道如何使调用工作.

Bog*_*dan 2

我不认为 pyinstaller 可以自行处理这种捆绑,至少我没有设法配置它(如果可能的话)。我还有一个相当大的应用程序,其中有一些调用

subprocess.Popen('python' ... )

完成。我最终让它发挥作用的方法是:

  1. 将子进程调用修改为不同的 python,例如subprocess.call(['gksudo','./python script2.py']). 根据您的情况,创建两个单独的分析,一个用于入口点,一个用于其余脚本:

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

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

    pyz = PYZ(a1.pure)
    exe = EXE(pyz,
      a1.scripts,
      exclude_binaries=1,
      name={name here},
      debug=False,
      strip=False,
      upx=True,
      console=1 )
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从所有脚本中收集

        coll = COLLECT( exe,
           a1.binaries,
           a1.zipfiles,
           a1.datas,
           a2.binaries,
           a2.zipfiles,
           a2.datas,
       python_tree, 
           *additional_trees,
           strip=False,
           upx=True,
           name={})
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将 python 复制到您的发行版中所有子进程调用中指定的位置,以及 pyinstaller 未找到的任何附加要求(我有一些像 matplotlib、pylab 等)

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

     export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
     export LD_RUN_PATH=`pwd`:$LD_RUN_PATH
    
    Run Code Online (Sandbox Code Playgroud)

现在,如果我希望应用程序在没有安装 python 的计算机上运行,​​或者如果安装了 python,则需要确保应用程序仍然使用分发包中的所有库而不是任何本地库。如果在你的情况下 python 已经安装在目标机器上,我认为这样的事情是不必要的,前 3 个步骤就足够了。