10

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

4

4 回答 4

12

.pyd 和 .DLL 在这里是不同的,因为 .pyd 应该由 modulefinder 自动找到并被包括在内(只要你有适当的“import”语句)而不需要做任何事情。如果遗漏了一个,您将执行与遗漏 .py 文件相同的操作(它们都只是模块):对 py2exe 选项使用“include”选项。

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"}}
     )
于 2008-10-22T02:27:44.420 回答
2

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

于 2008-10-21T05:08:35.530 回答
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)

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

于 2008-10-21T05:51:12.263 回答
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 文件。

于 2008-10-22T01:22:00.200 回答