在 PyInstaller 中打包多个脚本

2023-11-25

我正在使用 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 的分析

  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
    

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PyInstaller 中打包多个脚本 的相关文章

随机推荐