用cython扩展包装python

时间:2017-10-06 11:26:31

标签: python packages cython setuptools

我正在尝试构建一个同时使用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_integratortest_integrator的{​​{1}}在build目录中。附加到sys.path似乎是一个快速而肮脏的解决方案,我不太喜欢。

编辑: 正如评论中指出的那样,我还没有安装包裹。这是因为我不知道要从.so文件导入要写什么

1 个答案:

答案 0 :(得分:1)

没有特定的顺序:

  1. 文件setup.py通常位于项目根目录下面。例如:

    library_name/
        __init__.py
        file1.py
    setup.py
    README
    
  2. 然后,构建目录显示在项目的源旁边,而不是项目源。

  3. 要在Python中导入文件c_integrate.cpython-35m-x86_64-linux-gnu.so,只需导入" c_integrate"。其余的命名是自动处理的,因为它只是平台信息。请参阅PEP 3149

  4. 有效模块是

    之一
    1. 包含modulename/__init__.py文件
    2. 的目录
    3. 名为modulename.py
    4. 的文件
    5. 名为modulename.PLATFORMINFO.so
    6. 的文件

      当然位于Python路径中。因此,编译的Cython模块不需要__init__.py文件。

      根据您的情况,移动项目目录中的Cython代码并执行相对导入import .c_integrate或完整from integrator_modules import c_integrate,后者仅在您的包是安装

      其中一些信息可以在我关于Cython模块http://pdebuyl.be/blog/2017/cython-module.html

      的博客文章中找到

      我相信这应该让你建立一个合适的包,如果没有,请在下面评论。

      编辑:要完成配置(见下面的评论),海报也

      1. 修复了setup.py文件中的模块路径,以便它是从PYTHONPATH开始的完整模块名称:Extension("integrator_package.integrator_modules.c_integrat‌​or", ["integrator_package/integrator_modules/c_integrator.c"]而不是Extension("c_integrate", ["c_integrate.c"])]
      2. 对模块进行Cython化,构建它并使用相同的Python解释器。
      3. 进一步评论:setup.py文件也可以对文件进行cython化。包含.pyx文件而不是.c文件作为来源。

        cythonize(Extension('integrator_package.integrator_modules.c_integrat‌​or',
                  ["integrator_package/integrator_modules/c_integrator.pyx"],
                  include_dirs=[numpy.get_include()]))