我正在尝试构建一个同时使用python和cython模块的软件包。我在构建和安装后遇到导入问题,我不确定如何从构建过程生成的.so
文件导入文件。
在构建我的文件夹结构之前看起来像这样
root/
├── c_integrate.c
├── c_integrate.pyx
├── cython_builder.py
├── __init__.py
├── integrator_class.py
├── integrator_modules
│ ├── cython_integrator.py
│ ├── __init__.py
│ ├── integrator.py
│ ├── numba_integrator.py
│ ├── numpy_integrator.py
│ ├── quadratic_error.png
│ ├── report3.txt
│ ├── report4.txt
│ └── report5.txt
├── report6.txt
├── setup.py
└── test
├── __init__.py
└── test_integrator.py
使用python3.5 setup.py build
进行构建会在root
root/build/
├── lib.linux-x86_64-3.5
│ ├── c_integrate.cpython-35m-x86_64-linux-gnu.so
│ ├── integrator_modules
│ │ ├── cython_integrator.py
│ │ ├── __init__.py
│ │ ├── integrator.py
│ │ ├── numba_integrator.py
│ │ └── numpy_integrator.py
│ └── test
│ ├── __init__.py
│ └── test_integrator.py
setup.py
文件看起来像这样
from setuptools import setup, Extension, find_packages
import numpy
setup(
name = "integrator_package",
author = "foo",
packages = find_packages(),
ext_modules = [Extension("c_integrate", ["c_integrate.c"])],
include_dirs=[numpy.get_include()],
)
我的问题是:如何将.so
文件中的函数的import语句写入ìntegrator_class.py
中的root
以及位于cython_integrator
和test_integrator
的{{1}}在build
目录中。附加到sys.path
似乎是一个快速而肮脏的解决方案,我不太喜欢。
编辑:
正如评论中指出的那样,我还没有安装包裹。这是因为我不知道要从.so
文件导入要写什么
答案 0 :(得分:1)
没有特定的顺序:
文件setup.py通常位于项目根目录下面。例如:
library_name/
__init__.py
file1.py
setup.py
README
然后,构建目录显示在项目的源旁边,而不是项目源。
要在Python中导入文件c_integrate.cpython-35m-x86_64-linux-gnu.so,只需导入" c_integrate"。其余的命名是自动处理的,因为它只是平台信息。请参阅PEP 3149
有效模块是
之一modulename/__init__.py
文件modulename.py
modulename.PLATFORMINFO.so
当然位于Python路径中。因此,编译的Cython模块不需要__init__.py
文件。
根据您的情况,移动项目目录中的Cython代码并执行相对导入import .c_integrate
或完整from integrator_modules import c_integrate
,后者仅在您的包是安装
其中一些信息可以在我关于Cython模块http://pdebuyl.be/blog/2017/cython-module.html
的博客文章中找到我相信这应该让你建立一个合适的包,如果没有,请在下面评论。
编辑:要完成配置(见下面的评论),海报也
Extension("integrator_package.integrator_modules.c_integrator", ["integrator_package/integrator_modules/c_integrator.c"]
而不是Extension("c_integrate", ["c_integrate.c"])]
进一步评论:setup.py文件也可以对文件进行cython化。包含.pyx
文件而不是.c
文件作为来源。
cythonize(Extension('integrator_package.integrator_modules.c_integrator',
["integrator_package/integrator_modules/c_integrator.pyx"],
include_dirs=[numpy.get_include()]))