将第三方库添加到用 cython 编译的 pyd 文件并用 pyinstaller 在 exe 上打包

Add third party libs to pyd file compiled with cython and packaging on exe with pyinstaller

我正在使用 cython 将一个文件从 py 编译为 pyd,我创建我的 setup.py 如下:

from setuptools import setup
from Cython.Build import cythonize

setup(
    name = "My App",
    ext_modules = cythonize(['src\lib\module.py'])

在main.py中导入如下:

from src.lib.module import myclass

当我 运行 我的应用程序使用命令“python main.py”时它可以工作但是当 运行 el .exe 使用 pyinstaller 生成时它抛出异常 ImportError No moduled命名模块。

我尝试在 pyinstaller 的 spec 文件上的隐藏导入上导入 module.pyd,然后出现错误,No module import requests, request is used on module.pyd.

如果我已经安装了 requests 那么为什么 cython 或 pyinstaller 没有导入模块或者真正的问题是什么?

在你创建lib的pyInit文件中,你可以将项目的库和库目录设置为link。例如

extensions = [ Extension(name="xxxx",sources=["xxx.pyx"], libraries=["myclass"], library_dirs=["/src/libdirectory"], language="c++",), ]

这告诉 cython linker 去寻找图书馆。需要注意的一件事,对于 gnu 编译器,如果您希望 link 用户看到 "myclass"

,请确保将您的库命名为 "libmyclass.so"

好吧,有几件事没有看到太多代码...

您真的希望扩展名为 "src.libs.myGridLayout" 吗?意思是,你想做

import src.libs.myGridLayout

在您的 python 文件中?如果这是您的设计,那么这就是您所做的。该名称是实际扩展的名称。

library_dir 是查找 "external" 库的地方。 (如 Windows.lib)Cython 将为您编写的代码 link 项目的适当库,但对于其他任何内容,这就是您放在 "libraries" 目录中的内容。

顺便说一句,什么是 "namelibrary.lib"?如果它是你想在你的项目中使用的库,那么你只需添加找到该库的路径,然后将 "namelibrary" 添加到库中。

只要看看你为 cython 编写这个扩展的方式,我强烈建议你慢一点,阅读/学习更多关于如何设置项目以及如何使用这些扩展。祝你好运! :)