在PyInstaller中打包多个脚本

时间:2012-01-17 02:00:54

标签: python executable pyinstaller gksudo

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我不认为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 )
    
  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={})
    
  4. 在您的发行版中复制python,在所有子进程调用中指定的位置使用pyinstaller找不到的任何其他要求(我有一些像matplotlib,pylab等)

  5. 创建一个启动脚本,首先将所有必需的环境变量更改为指向您的包,然后启动该应用。在我的情况下,需要的是来自调用目录:

     export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
     export LD_RUN_PATH=`pwd`:$LD_RUN_PATH
    
  6. 现在所有这些都是必需的,如果我希望应用程序在没有安装python的机器上运行,或者如果它们安装了python,请确保应用程序仍然使用分发包中的所有库而不是任何本地库。如果在你的情况下python已经安装在目标机器上,我认为没有必要这样做,前三步就足够了。