Python 准备基于C的Cython包以在pypi上发布
我将创建C库,并希望使用Cython创建Python包装器 现在我已经编译并绑定了Python 准备基于C的Cython包以在pypi上发布,python,cython,pypi,Python,Cython,Pypi,我将创建C库,并希望使用Cython创建Python包装器 现在我已经编译并绑定了mylib.a文件(C文件),我想用Cython包装我库中的方法 我成功地创建了.pyx和.pxd文件,我可以使用python setup.py build\u ext命令来构建它。当我尝试在pypi上发布它时,我的问题出现了。如果我运行我的setup.py,创建轮子并发布它,我可以从pypi下载它-但我不能运行import mylib 我在网上读了很多这方面的教程。很少有人表示他们的C代码是在用户端编译的。我的代
mylib.a
文件(C文件),我想用Cython包装我库中的方法
我成功地创建了.pyx
和.pxd
文件,我可以使用python setup.py build\u ext
命令来构建它。当我尝试在pypi上发布它时,我的问题出现了。如果我运行我的setup.py
,创建轮子并发布它,我可以从pypi下载它-但我不能运行import mylib
我在网上读了很多这方面的教程。很少有人表示他们的C代码是在用户端编译的。我的代码库将由许多文件构建,我更愿意将已经构建的C代码作为.a
文件提供
我的文件结构(仅重要文件):
我的\uuuu init\uuuuu.py
文件(导入从pip下载的包后,它在此处抛出错误):
Mysetup.py
(我认为只有重要参数):
(我在python setup.py build\u ext
之前使用mylib.pyx
中的cython构建mylib.bycode.c
。根据文章,这将加快安装包的速度,并且不需要用户使用相同的cython版本。)
也许值得一提的是,在构建了我的包之后,我得到了mylib的。所以文件。如果我将其复制到/mylib
目录,那么我可以从父目录导入mylib
,并使用mylib.mylib.say_hello()
访问我的方法。但是,它在从pip安装的软件包(在其他PC上)上不起作用,我也不想使用mylib.mylib
如果我应该提供更多的信息-让我知道
编辑:
我在GitHub上的项目(我之前混淆了名称,所以这里是真正的项目):
我想从statr.pyx
成功运行say_hello()
方法(其他方法可能不起作用)
我知道代码有一些问题,但我想首先有一个工作核心来修复和更新一切。要生成项目,请使用build\u script.sh
upload\u script.sh
创建并发布控制盘。在setup.py
中有几个问题
setup.py
未编译链接到库。这意味着它必须手动编译
- 链接到库是预编译的静态链接存档。这是不可移植的,除了用于构建它的GCC/glibc的确切版本之外,不能分发到任何其他地方
- cython扩展代码不是由
setup.py
生成的。对.pyx/.pxd的更改不会反映在包中
尝试以下方法:
from setuptools import setup, find_packages, Extension
from Cython.Build import cythonize, build_ext
extensions = [Extension(
name="statr._ext",
sources=["statr/_ext.pyx", "lib/mylib.c"],
depends="lib/mylib.h",
include_dirs=[numpy.get_include(), "lib/"]
]
setup(name='statr'
packages=find_packages(),
ext_modules=cythonize(extensions),
build_ext: build_ext
}
)
根据上述内容,扩展名将为statr.\u ext
。pyx的名称应为\u ext.pyx
mylib.c
将通过setup.py
构建并链接到扩展。mylib.c
所需的任何其他编译器指令都应添加到扩展中
包名称将是statr
。例如,您应该从\u ext
导入任何您希望从其\uuuu init\uuuuuuuuuuuuuuuupy
模块的顶层statrd
中可用的内容
from ._ext import my_cython_function
如何从PyPI安装?(下载+python setup.py安装
或pip安装
)。当时有错误消息吗?导入mylib时出现任何错误(如果是,具体是什么错误)?对于Cython软件包,您可以提供pyx/pxd文件或c文件,就像您所做的那样。两者都应该起作用。有关更多信息,请。@Pierredebyl感谢您的关注。我尝试了pip安装
。我遇到了一些常见的错误-指向\uuu init\uuuuu.py
的第一行,说无法安装名称“mylib”
。在这一点上,我的整个项目可以作为最小的例子。我添加了有关github的链接。
setup(name='mylib'
packages=['mylib'],
ext_modules = [Extension(
name="mylib",
sources=["mylib/mylib.bycython.c"],
include_dirs = [numpy.get_include(), "lib/"],
extra_objects=["lib/mylib.a"])],
"build_ext": build_ext
}
)
from setuptools import setup, find_packages, Extension
from Cython.Build import cythonize, build_ext
extensions = [Extension(
name="statr._ext",
sources=["statr/_ext.pyx", "lib/mylib.c"],
depends="lib/mylib.h",
include_dirs=[numpy.get_include(), "lib/"]
]
setup(name='statr'
packages=find_packages(),
ext_modules=cythonize(extensions),
build_ext: build_ext
}
)
from ._ext import my_cython_function