6

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

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

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

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

4

1 回答 1

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

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

     export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
     export LD_RUN_PATH=`pwd`:$LD_RUN_PATH
    

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

于 2012-01-17T09:08:08.047 回答