【问题标题】:cython import error in same package同一包中的cython导入错误
【发布时间】:2018-05-24 23:47:29
【问题描述】:

我见过this question,但答案似乎不起作用。以下是我的目录结构。

.
├── my_package
│   ├── a.pyx
│   ├── b.pyx
│   ├── b.pxd
│   ├── test.py
│   └── __init__.py
└── setup.py

一个.pyx文件

cimport my_package.b  as b

class a:
    def __init__(self):
        self.b = b.b()
        self.b.run()

b.pyx 文件

cdef class b:

    def __init__(self):
        pass

    cpdef run(self):
        print "b is running"

b.pxd 文件

cdef class b:
    cpdef run(self)

test.py

import a

c = a.a()

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy

extensions = [
    Extension("my_package.a", ["my_package/a.pyx"]
        ),
    Extension("my_package.b", ["my_package/b.pyx"]
)
]

for e in extensions:
    e.cython_directives = {"embedsignature": True}

setup(
    name = "preprocess",
    ext_modules = cythonize(extensions),
)

运行python setup.py build_ext --inplace 后没有编译错误。但如果我尝试运行 test.py,它会给出ImportError: No module named my_package.b

我们将不胜感激。

顺便说一句,如果我们将 a.pyx 的第一行从 cimport my_package.b as b 更改为 import b 它将起作用。

【问题讨论】:

    标签: python cython cythonize


    【解决方案1】:

    要使子包的cimport 工作,包目录需要包含__init__.pxd

    对于cimport,它相当于__init__.py,而不是import

    使目录结构如下:

    .
    ├── my_package
    │   ├── a.pyx
    │   ├── b.pyx
    │   ├── b.pxd
    │   ├── test.py
    │   └── __init__.py
    │   └── __init__.pxd
    └── setup.py
    

    然后将 pxd 文件作为包数据包含在 setup.py 中,以便安装它们:

    from setuptools import setup, Extension
    from Cython.Build import cythonize
    
    extensions = [
        Extension("my_package.a", ["my_package/a.pyx"]
            ),
        Extension("my_package.b", ["my_package/b.pyx"]
    )
    ]
    
    for e in extensions:
        e.cython_directives = {"embedsignature": True}
    
    package_data = {'my_package': ['*.pxd']}
    
    setup(
        name = "preprocess",
        ext_modules = cythonize(extensions),
        include_package_data=True,
        package_data=package_data,
    )
    

    注意 - import numpy 不应该在 setup.py 中,因为除非已经安装了 numpy,否则它会使安装包不起作用。

    把它放在requirements.txt 中,让它和包一起安装。

    【讨论】:

    • 您好感谢您的回答,我还有一些问题。 1. 在尝试您的 setup.py 后,我收到了 Unknown distribution option: 'include_package_data'。我尝试安装 python-distutils-extra(在 ubuntu 16.04 中),但警告没有响起。 2. 我假设 init.pxd 是一个空文件,就像 init.py 一样? 3. 你有什么可以借鉴的吗?
    • 已更新 - 需要从 setuptools 导入并可能还更新 setuptools。 __init__.pxd 应该为空。 cython docs 非常好,但不能涵盖所有内容。边做边学效果很好。
    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多