在py2exe构建中包含PYDs/DLLs

10 投票
4 回答
15616 浏览
提问于 2025-04-11 18:51

我有一个应用程序的模块,它使用了一个.pyd文件里的函数。虽然有一个选项可以排除dll文件(exclude_dlls),但有没有办法可以把它们包含进去呢?在构建过程中,似乎没有把我的模块中的.pyd文件复制过去,尽管其他的文件(.py)都被复制了。我还需要包含一个.dll文件。请问我该怎么做才能让py2exe同时包含.pyd和.dll文件呢?

4 个回答

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

也许你可以在setup()中使用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文件的情况。

12

.pyd文件和.DLL文件在这里是不同的,.pyd文件应该可以被模块查找器自动找到,只要你有正确的“import”语句,就不需要额外操作。如果有一个没有被找到,你就像漏掉了一个.py文件一样处理(它们都是模块):使用py2exe选项中的“include”选项。

模块查找器不一定能找到.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"}}
     )

撰写回答