Один из модулей для моего приложения использует функции из .pyd-файла. Есть возможность исключить DLL (exclude_dlls), но есть ли для их включения? Процесс сборки, похоже, не копирует .pyd в моем модуле, несмотря на копирование остальных файлов (.py). Мне также нужно включить DLL. Как получить py2exe для включения файлов .pyd и .dll?В том числе PYDs/DLL в py2exe builds
ответ
Если они не обнаружены автоматически, попробуйте вручную скопировать их в каталог временных файлов py2exe. Они будут включены в окончательный исполняемый файл.
Вы можете изменить сценарий установки для копирования файлов в явном виде:
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)
и т.д. ... изменить в соответствии с вашими потребностями, конечно.
Может быть, вы могли бы использовать опцию data_files для настройки():
import glob
setup(name='MyApp',
# other options,
data_files=[('.', glob.glob('*.dll')),
('.', glob.glob('*.pyd'))],
)
data_files должен быть список кортежей, где каждый кортеж содержит:
- Целевой каталог.
- Список файлов для копирования.
Это не поместит файлы в library.zip, что не должно быть проблемой для dll, но я не знаю о файлах pyd.
.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"}}
)
В текущей версии py2exe data_files должен выглядеть так: data_files = [(DIR, [FILE, FILE, FILE]), ...] – 2010-03-02 20:28:00
Да, но в идеале это должно быть частью сценария setup.py или помещаться в мой пакетный скрипт для создания исполняемого файла. – TheObserver 2008-10-21 05:13:08