2012-01-17 115 views
4

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

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

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

这很好,当我正常运行脚本,但一旦他们打包在PyInstaller我不知道如何使电话工作。

回答

1

我不认为pyinstaller可以自己处理这种捆绑,至少我没有设法配置它,如果可能的话。我也有一个相当大的应用程序在何处

subprocess.Popen几个电话( '蟒蛇' ......)

完成。我终于做到了工作方式是:

  1. 修改您的通话子到不同的蟒蛇,就像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. 在您的那个在与没有被pyinstaller发现任何附加要求所有子进程调用指定的位置分配复制蟒蛇(我有几个像matplotlib,pylab等)

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

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

现在,所有的这些,如果我想在机器上,要么有没有安装Python或如果他们已经安装了Python运行应用程序被要求,请确保应用程序仍使用分发包中的所有库而不是任何本地库。如果你的情况python已经安装在目标机器上,我不认为像这样的任何东西是必要的,前3步就足够了。