Включение PYD / DLL в сборки py2exe - PullRequest
10 голосов
/ 21 октября 2008

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

Ответы [ 4 ]

12 голосов
/ 22 октября 2008

.pyd и .DLL здесь отличаются, в том смысле, что .pyd должен автоматически обнаруживаться модулем поиска и таким образом включаться (при условии, что у вас есть соответствующий оператор "import") без необходимости что-либо делать. Если один из них пропущен, вы делаете то же самое, как если бы файл .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 голосов
/ 21 октября 2008

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

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 голосов
/ 22 октября 2008

Может быть, вы можете использовать опцию 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-файлах.

2 голосов
/ 21 октября 2008

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

...