在py2exe构建中包含PYD / DLL

时间:2008-10-21 04:40:57

标签: python dll installation py2exe pyd

我的应用程序的一个模块使用.pyd文件中的函数。有一个选项可以排除dlls(exclude_dlls),但有一个包含它们吗?尽管复制了其余的文件(.py),构建过程似乎并没有复制模块中的.pyd。我还需要包含一个.dll。如何让py2exe包含.pyd和.dll文件?

4 个答案:

答案 0 :(得分:12)

.pyd和.DLL在这里是不同的,因为.pyd应该由modulefinder自动找到并且包括在内(只要你有适当的“import”语句),而不需要做任何事情。如果错过了一个,你会做同样的事情,就好像错过.py文件一样(它们都只是模块):对py2exe选项使用“include”选项。

Modulefinder不一定会找到.DLLs的依赖项(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"}}
     )

答案 1 :(得分:2)

如果没有自动检测到它们,请尝试手动将它们复制到py2exe的临时构建目录中。它们将包含在最终的可执行文件中。

答案 2 :(得分: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)

等...当然可以根据您的需要进行修改。

答案 3 :(得分:2)

也许你可以使用data_files选项来设置():

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

data_files应该是元组列表,其中每个元组包含:

  1. 目标目录。
  2. 要复制的文件列表。
  3. 这不会把文件放到library.zip中,这对于dll应该不是问题,但我不知道pyd文件。