fra*_*iis 5 python cython pypi
我将创建 C 库,我想使用 Cython 创建 Python 包装器。
现在我已经mylib.a
编译并捆绑了文件(C 文件),我想将我的库中的方法包装在 Cython 中。
我成功创建.pyx
和.pxd
文件,我可以使用python setup.py build_ext
命令来构建它。当我尝试在 pypi 上发布它时出现了我的问题。如果我运行我的setup.py
,创建轮子并发布它,我可以从 pypi 下载它 - 但我不能运行import mylib
.
我为此阅读了很多在线教程。他们中很少有人表明他们的 C 代码是在用户端编译的。我的代码库将由许多文件构建,我更愿意提供已经构建的 C 代码作为.a
文件。
我的文件结构(仅重要文件):
/ lib
- mylib.a
- *.h files (for mylib.a)
- setup.py
/ mylib
- mylib.pyx
- cmylib.pxd
- __init__.py
Run Code Online (Sandbox Code Playgroud)
我的__init__.py
文件(导入从 pip 下载的包后,它会在此处引发错误):
from . import mylib
Run Code Online (Sandbox Code Playgroud)
我的setup.py
(只有重要参数 - 在我看来):
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
}
)
Run Code Online (Sandbox Code Playgroud)
(我mylib.bycode.c
在python setup.py build_ext
使用 cython之前构建mylib.pyx
。根据这篇文章,它会使安装包更快,并且不需要用户具有相同的 cython 版本。)
也许值得一提 - 在构建我的包后,我得到.so
了 mylib 的文件。如果我将它复制到/mylib
目录,然后从父目录我可以import mylib
使用mylib.mylib.say_hello()
. 但是它不适用于从 pip(在其他 PC 上)安装的软件包,我也不想使用mylib.mylib
.
如果我应该提供更多信息 - 让我知道。
编辑:
我在 GitHub 上的项目(我之前混淆了名称,所以这里是真正的项目):https : //github.com/franiis/statr-python
我想say_hello()
从statr.pyx
(其他方法可能不起作用)成功运行方法。
我知道代码有一些问题,但我想首先拥有工作核心来修复和更新所有内容。要构建项目,请使用build_script.sh
. upload_script.sh
创建轮子并发布它。
中存在几个问题setup.py
。
setup.py
。这意味着它必须手动编译。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
}
)
Run Code Online (Sandbox Code Playgroud)
通过以上内容,扩展名将是statr._ext
. pyx 的名称应该是_ext.pyx
.
mylib.c
将由 构建并链接到扩展setup.py
。应将所需的任何其他编译器指令mylib.c
添加到扩展中。
包名称将为statr
. 您应该从其_ext
顶级模块中导入您希望可用的任何内容,例如statrd
__init__.py
from ._ext import my_cython_function
Run Code Online (Sandbox Code Playgroud)