使用cython扩展打包python

使用cython扩展打包python,python,packages,cython,setuptools,Python,Packages,Cython,Setuptools,我正在尝试构建一个同时使用python和cython模块的包。我遇到的问题是在构建和安装之后的导入,我不确定如何从构建过程生成的文件导入文件 在构建我的文件夹结构之前,如下所示 root/ ├── c_integrate.c ├── c_integrate.pyx ├── cython_builder.py ├── __init__.py ├── integrator_class.py ├── integrator_modules │   ├── cython_integrator.py │  

我正在尝试构建一个同时使用python和cython模块的包。我遇到的问题是在构建和安装之后的导入,我不确定如何从构建过程生成的
文件导入文件

在构建我的文件夹结构之前,如下所示

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/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
文件写入
cython\u integrator
目录中的
integrator\u class.py
test\u integrator
中。附加到
sys.path
似乎是一个我不太喜欢的快速而肮脏的解决方案

编辑: 正如评论中指出的,我还没有安装这个软件包。这是因为我不知道要从
导入什么。因此
文件

没有特定顺序:

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

    library_name/
        __init__.py
        file1.py
    setup.py
    README
    
  • 然后,生成目录出现在项目源旁边,而不是项目源中

  • 要在Python中导入文件c_integrate.cpython-35m-x86_64-linux-gnu.so,只需导入“c_integrate”。命名的其余部分将自动处理,因为它只是平台信息。看

  • 一个有效的模块是

  • 带有
    modulename/\uuuuu init\uuuuu.py
    文件的目录
  • 名为
    modulename.py的文件
  • 名为
    modulename.PLATFORMINFO.so的文件
  • 当然位于Python路径中。因此,对于已编译的Cython模块,不需要
    \uuuu init\uuuu.py
    文件

    对于您的情况,请在项目目录中移动Cython代码,然后执行相对导入
    import.c\u integrate
    或从integrator\u模块导入完整的
    ,后者仅在安装软件包时起作用

    其中一些信息可以在我关于Cython模块的博客文章中找到

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

    编辑:要完成配置(请参见下面的注释),海报也会

  • 修复了setup.py文件中的模块路径,使其成为从PYTHONPATH:
    扩展名(“integrator\u package.integrator\u modules.c\u integrat”)开始的完整模块名‌​或者“,[“integrator\u package/integrator\u modules/c\u integrator.c”]
    而不是
    扩展(“c\u integrate”,[“c\u integrate.c”])]
  • 对模块进行Cythonize、构建并与同一个Python解释器一起使用
  • 进一步说明:setup.py文件也可以对文件进行cythonize。将
    .pyx
    文件而不是
    .c
    文件作为源文件

    cythonize(Extension('integrator_package.integrator_modules.c_integrat‌​or',
              ["integrator_package/integrator_modules/c_integrator.pyx"],
              include_dirs=[numpy.get_include()]))
    
    没有具体顺序:

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

    library_name/
        __init__.py
        file1.py
    setup.py
    README
    
  • 然后,生成目录出现在项目源旁边,而不是项目源中

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

  • 一个有效的模块是

  • 带有
    modulename/\uuuuu init\uuuuu.py
    文件的目录
  • 名为
    modulename.py的文件
  • 名为
    modulename.PLATFORMINFO.so的文件
  • 当然位于Python路径中。因此,对于已编译的Cython模块,不需要
    \uuuu init\uuuu.py
    文件

    对于您的情况,请在项目目录中移动Cython代码,然后执行相对导入
    import.c\u integrate
    或从integrator\u模块导入完整的
    ,后者仅在安装软件包时起作用

    其中一些信息可以在我关于Cython模块的博客文章中找到

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

    编辑:要完成配置(请参见下面的注释),海报也会

  • 修复了setup.py文件中的模块路径,使其成为从PYTHONPATH:
    扩展名(“integrator\u package.integrator\u modules.c\u integrat”)开始的完整模块名‌​或者“,[“integrator\u package/integrator\u modules/c\u integrator.c”]
    而不是
    扩展(“c\u integrate”,[“c\u integrate.c”])]
  • 对模块进行Cythonize、构建并与同一个Python解释器一起使用
  • 进一步说明:setup.py文件也可以对文件进行cythonize。将
    .pyx
    文件而不是
    .c
    文件作为源文件

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

    相关吗?似乎你没有像@DavidW指出的那样安装你构建的包。问题
    pip install path/to/root/
    pip install--editable=path/to/root/
    将构建的文件与python结合起来。是的,我还没有安装它-但我的问题是,既然
    。所以
    文件被命名为特定于平台的,我不知道现在如何导入它。特别是由于
    lib.linux…
    文件夹没有
    \uuuu init\uuuu.py
    文件。另外:在我安装后,只需尝试重命名
    。因此
    文件并导入它会引发
    系统错误:父模块“”未加载,无法执行相对导入
    相关吗?似乎您没有安装你像@DavidW那样构建的包指出。问题
    pip install path/to/root/
    pip install--editable=path/to/root/
    为了将构建的文件与python结合起来。是的,我还没有安装它-但我的问题是,由于
    文件被命名为特定于平台的文件,我不知道如何导入它。特别是自从e
    lib.linux…
    文件夹没有
    \uuuuu init\uuuuuu.py
    文件