Упаковка нескольких скриптов в PyInstaller - PullRequest
5 голосов
/ 17 января 2012

Я использую PyInstaller, чтобы превратить два скрипта в один исполняемый файл, один из которых вызывает другой. У меня проблема в том, что я не могу понять, как связать два сценария и все же позволить им ссылаться друг на друга:

Код, вызывающий проблему, состоит в том, что один скрипт script1.py содержит:

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

Это нормально работает, когда я запускаю сценарии в обычном режиме, но как только они упакованы в PyInstaller, я не знаю, как заставить вызов работать.

1 Ответ

1 голос
/ 17 января 2012

Я не думаю, что pyinstaller может справиться с такого рода связыванием самостоятельно, по крайней мере мне не удалось настроить его, если это возможно. У меня также есть довольно большое приложение, где некоторые звонки на

subprocess.Popen ('python' ...)

сделано. Я наконец-то заставил это работать:

  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. Скопируйте 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 шагов будет достаточно.

...