Python 在PyInstaller可执行文件中处理动态加载的.pyd模块的导入
我正在开发一个python程序,它根据用户定义的配置动态地尝试导入库模块。为此,我尝试使用Python 在PyInstaller可执行文件中处理动态加载的.pyd模块的导入,python,dynamic,pyinstaller,cython,Python,Dynamic,Pyinstaller,Cython,我正在开发一个python程序,它根据用户定义的配置动态地尝试导入库模块。为此,我尝试使用\uuuuu import\uuuu(),如果失败,则处理异常。 在python中运行程序时,这一切都非常有效 但我希望将该程序作为一个独立的包分发,特别是为了避免python安装冲突的问题。 要做到这一点,使用PyInstaller似乎是一个很好的方法 但是,如果我使用在hiddenimport中包含动态加载的库模块的基本方法,它将被捆绑在.exe中,并且用户无法在没有访问源代码和重新编译的情况下添加新模
\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
- 如果我必须用手把所有的东西都写下来的话,那就太麻烦了
- 我不知道还有什么办法
.pyd
中捆绑它们,或者任何允许我以独立格式正确发布我的程序的方法,其中包含第三方模块,可以动态链接到这些模块,而不会导致导入失败,这也不太老套
extensions = [Extension("Integrations.*", ["src/ThirdParty/*.py"])]
setup(
ext_modules=cythonize(
extensions,
exclude="src/ThirdParty/__init__.py",
include_path=["src/"],
language_level = "3"
), )