Python 在PyInstaller可执行文件中处理动态加载的.pyd模块的导入

Python 在PyInstaller可执行文件中处理动态加载的.pyd模块的导入,python,dynamic,pyinstaller,cython,Python,Dynamic,Pyinstaller,Cython,我正在开发一个python程序,它根据用户定义的配置动态地尝试导入库模块。为此,我尝试使用\uuuuu import\uuuu(),如果失败,则处理异常。 在python中运行程序时,这一切都非常有效 但我希望将该程序作为一个独立的包分发,特别是为了避免python安装冲突的问题。 要做到这一点,使用PyInstaller似乎是一个很好的方法 但是,如果我使用在hiddenimport中包含动态加载的库模块的基本方法,它将被捆绑在.exe中,并且用户无法在没有访问源代码和重新编译的情况下添加新模

我正在开发一个python程序,它根据用户定义的配置动态地尝试导入库模块。为此,我尝试使用
\uuuuu import\uuuu()
,如果失败,则处理异常。 在python中运行程序时,这一切都非常有效

但我希望将该程序作为一个独立的包分发,特别是为了避免python安装冲突的问题。 要做到这一点,使用PyInstaller似乎是一个很好的方法

但是,如果我使用在
hiddenimport
中包含动态加载的库模块的基本方法,它将被捆绑在
.exe
中,并且用户无法在没有访问源代码和重新编译的情况下添加新模块

我的第二种方法是使用PyInstaller和Cython的组合

  • 我将所有动态加载的模块放在主程序中导入的包文件夹
    modules
  • 我使用Cython将模块编译成
    .pyd
    文件,使用:
  • 我为包编写了一个钩子,它使用
    binaries=[('ThirdParty\\\*.pyd','ThirdParty\\\.')]
    包含编译的动态加载模块
希望是要添加一个新模块,我只需在
ThirdParty/
中删除
.pyd
文件,程序就可以加载它了

但是,模块导入了一些python模块,这些模块在程序的其余部分中不一定使用,因此当我执行
\uuuu import\uuuu(ThirdParty.MyModule)
时,程序会尝试加载
ThirdParty/MyModule.*.pyd
,但会为其他模块抛出导入错误,因为它们既不捆绑在
.pyd
文件中,也不捆绑在基本程序中

我考虑和/或研究的解决问题的方法有:

  • 在这些模块上使用
    hiddenimport
    。显然,如果所有的导入都必须在主程序中编译,那么就不能使用外部模块
  • 为模块创建一个钩子。稍微少一些黑客,但同样的问题,加上我不知道如何从包钩子激活模块的钩子
  • 将导入绑定到
    .pyd
    。。。这可能吗
  • 打包模块以将其与
    .pyd
    文件一起安装。
    • 如果我必须用手把所有的东西都写下来的话,那就太麻烦了
    • 我不知道还有什么办法
因此,简而言之,我正在寻找一种非黑客方式来识别和冻结cythonized模块的导入,并将其发送出去,或者在
.pyd
中捆绑它们,或者任何允许我以独立格式正确发布我的程序的方法,其中包含第三方模块,可以动态链接到这些模块,而不会导致导入失败,这也不太老套

extensions = [Extension("Integrations.*", ["src/ThirdParty/*.py"])]
setup(
    ext_modules=cythonize(
        extensions, 
        exclude="src/ThirdParty/__init__.py", 
        include_path=["src/"], 
        language_level = "3"
        ), )