【问题标题】:Including PYDs/DLLs in py2exe builds在 py2exe 构建中包含 PYD/DLL
【发布时间】:2008-10-21 04:40:57
【问题描述】:

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

【问题讨论】:

    标签: python dll installation py2exe pyd


    【解决方案1】:

    .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"}}
         )
    

    【讨论】:

    • 在当前版本的py2exe中,data_files应该是这样的:data_files = [ (DIR, [FILE, FILE, FILE]), ... ]
    • 当我这样做时,我需要使用“includes”而不是“include”,否则 py2exe 会报错。
    • 我在查找 pyd 文件时遇到了同样的问题,我已经尝试包含丢失的资源,但 py2exe 仍然找不到它。
    【解决方案2】:

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

    【讨论】:

    • 是的,但理想情况下,它应该是 setup.py 脚本的一部分,或者放在我的批处理脚本中以创建可执行文件。
    【解决方案3】:

    您可以修改设置脚本以显式复制文件:

    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)
    

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

    【讨论】:

      【解决方案4】:

      也许你可以在 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文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        相关资源
        最近更新 更多