2008-10-21 9 views
9

Один из модулей для моего приложения использует функции из .pyd-файла. Есть возможность исключить DLL (exclude_dlls), но есть ли для их включения? Процесс сборки, похоже, не копирует .pyd в моем модуле, несмотря на копирование остальных файлов (.py). Мне также нужно включить DLL. Как получить py2exe для включения файлов .pyd и .dll?В том числе PYDs/DLL в py2exe builds

ответ

2

Если они не обнаружены автоматически, попробуйте вручную скопировать их в каталог временных файлов py2exe. Они будут включены в окончательный исполняемый файл.

+0

Да, но в идеале это должно быть частью сценария setup.py или помещаться в мой пакетный скрипт для создания исполняемого файла. – TheObserver 2008-10-21 05:13:08

2

Вы можете изменить сценарий установки для копирования файлов в явном виде:

script = "PyInvaders.py"  #name of starting .PY 
project_name = os.path.splitext(os.path.split(script)[1])[0] 
setup(name=project_name, scripts=[script]) #this installs the program 

#also need to hand copy the extra files here 
def installfile(name): 
    dst = os.path.join('dist', project_name) 
    print 'copying', name, '->', dst 
    if os.path.isdir(name): 
    dst = os.path.join(dst, name) 
    if os.path.isdir(dst): 
     shutil.rmtree(dst) 
    shutil.copytree(name, dst) 
    elif os.path.isfile(name): 
    shutil.copy(name, dst) 
    else: 
    print 'Warning, %s not found' % name 

pygamedir = os.path.split(pygame.base.__file__)[0] 
installfile(os.path.join(pygamedir, pygame.font.get_default_font())) 
installfile(os.path.join(pygamedir, 'pygame_icon.bmp')) 
for data in extra_data: 
    installfile(data) 

и т.д. ... изменить в соответствии с вашими потребностями, конечно.

2

Может быть, вы могли бы использовать опцию data_files для настройки():

import glob 
setup(name='MyApp', 
     # other options, 
     data_files=[('.', glob.glob('*.dll')), 
        ('.', glob.glob('*.pyd'))], 
    ) 

data_files должен быть список кортежей, где каждый кортеж содержит:

  1. Целевой каталог.
  2. Список файлов для копирования.

Это не поместит файлы в library.zip, что не должно быть проблемой для dll, но я не знаю о файлах pyd.

11

.pyd и .DLL здесь разные, в том, что .pyd должен быть автоматически найден модулем и включен (при условии, что у вас есть соответствующий «импорт») без необходимости ничего делать. Если пропустить, вы делаете то же самое, что и файл .py был пропущен (они оба являются просто модулями): используйте опцию «include» для параметров py2exe.

Modulefinder не обязательно найдет зависимости от .DLL (py2exe может обнаружить некоторые), поэтому вам может потребоваться явно включить их с опцией «data_files».

Например, если у вас было два .DLL ('foo.dll' и 'bar.dll') для включения и три .pyd ('module1.pyd', 'module2.pyd' и 'module3. pyd ') для включения:

setup(name='App', 
     # other options, 
     data_files=[('.', 'foo.dll'), ('.', 'bar.dll')], 
     options = {"py2exe" : {"includes" : "module1,module2,module3"}} 
    ) 
+2

В текущей версии py2exe data_files должен выглядеть так: data_files = [(DIR, [FILE, FILE, FILE]), ...] – 2010-03-02 20:28:00