2013-12-24 4 views
2

В настоящее время я использую pyinstaller для связывания моего приложения python. Я равномерно перехожу к pyGObject (из-за обесценения pygtk).cx_freeze & bundling files

Теперь pyinstaller не поддерживает pyGObject, и пока я еще не выяснил необходимые крючки ... Один из других недостатков pyinstaller заключается в том, как он объединяется в один исполняемый файл - он заставляет проверку установленного антивирусного сканера довольно интенсивно каждый раз, когда exe запускается ==> довольно медленный запуск.

Заглядывая в использование cx_freeze из-за pyGObject & Поддержка py3 Я отмечаю, что у него нет однострочного варианта. Это само по себе не является проблемой, если рабочий каталог можно очистить, будь то через pyd/dll, связанный со вторым почтовым индексом или в подкаталог.

Поиск по (stackoverflow и другим сайтам), не имеет значения, что это можно сделать, но я не получаю ожидаемых результатов. Есть идеи?

setup.py базируется вокруг этого один: http://wiki.wxpython.org/cx_freeze

+0

через 'build_exe': «dist/data» Мне удалось сопоставить файлы dll/pyd в подкаталоге, однако теперь я получаю ошибки импорта , Добавление sys.path + ['./ data'] в качестве параметра пути не разрешает это. – Naib

+1

Файлы pyd/dll - это скомпилированные библиотеки, которые нельзя загрузить из zip-файла (хотя их можно извлечь из zip-файла до того, как программа им понадобится). Изменение 'sys.path' должно работать для файлов pyd, но сложнее изменить, откуда загружаются DLL - см. [Эту страницу документа MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop /ms682586%28v=vs.85%29.aspx#search_order_for_desktop_applications). –

ответ

5

нормально решена:

1) setup.py

import sys 
from cx_Freeze import setup, Executable 
EXE1 = Executable(
    # what to build 
    script = "foo.py", 
    initScript = None, 
    base = 'Win32GUI', 
    targetDir = "dist", 
    targetName = "foo.exe", 
    compress = True, 
    copyDependentFiles = True, 
    appendScriptToExe = True, 
    appendScriptToLibrary = False, 
    icon = 'foo.ico' 
    ) 

setup(
    version = "9999", 
    description = "...", 
    author = "...", 
    name = "...", 

    options = {"build_exe": {"includes": includes, 
          "excludes": excludes, 
          "packages": packages, 
          "path": sys.path, 
          "append_script_to_exe":False, 
          "build_exe":"dist/bin", 
          "compressed":True, 
          "copy_dependent_files":True, 
          "create_shared_zip":True, 
          "include_in_shared_zip":True, 
          "optimize":2, 
          } 
       }, 

    executables = [EXE1] 
    ) 

2) foo.py заголовок:

import os 
import sys 

if getattr(sys,'frozen',False): 
    # if trap for frozen script wrapping 
    sys.path.append(os.path.join(os.path.dirname(sys.executable),'bin')) 
    sys.path.append(os.path.join(os.path.dirname(sys.executable),'bin\\library.zip')) 
    os.environ['TCL_LIBRARY'] = os.path.join(os.path.dirname(sys.executable),'bin\\tcl') 
    os.environ['TK_LIBRARY'] = os.path.join(os.path.dirname(sys.executable),'bin\\tk') 
    os.environ['MATPLOTLIBDATA'] = os.path.join(os.path.dirname(sys.executable),'bin\\mpl-data')