【问题标题】:Cython C-level interface of package: *.pxd files are not found包的 Cython C 级接口:*.pxd 文件未找到
【发布时间】:2020-04-20 01:55:33
【问题描述】:

简而言之

我尝试编译一个名为 extension2 的 cython 扩展,该扩展从自创建的包中导入文件 extension。在构建extension2 时,我得到了extension.pxd 没有找到的错误,虽然这个文件正好在指定的路径中。

详情

我正在构建两个涉及 cython 的包,一个包A 和一个依赖于A 的包BA 是命名空间包nsp 的子包。即文件夹结构如下:

├── nsp
│   └── A
|       ├── extension.pxd
|       ├── extension.pyx
│       └── __init__.py
└── setup.py

这里,setup.py 内容如下:

from setuptools import setup
from setuptools.extension import Extension

# factory function
def my_build_ext(pars):
    # import delayed:
    from setuptools.command.build_ext import build_ext as _build_ext

    # include_dirs adjusted: 
    class build_ext(_build_ext):
        def finalize_options(self):
            _build_ext.finalize_options(self)
            # Prevent numpy from thinking it is still in its setup process:
            __builtins__.__NUMPY_SETUP__ = False
            import numpy
            self.include_dirs.append(numpy.get_include())

    #object returned:
    return build_ext(pars)

extensions = [Extension(nsp.A.extension, ['nsp/A/extension.cpp'])]

setup(
    cmdclass={'build_ext' : my_build_ext},
    setup_requires=['numpy'],
    install_requires=['numpy'], 
    packages=['nsp.A'],
    ext_modules=extensions
    package_data={
        'nsp/A': ['*.pxd', '*.pyx']
    },
)

安装文件的灵感来自add-numpy-get-include-argument-to-setuptools-without-preinstalled-numpydistributing-cython-modules。 cython 文件已经使用另一个脚本成功转换为 .cpp 文件。

我用

安装包A
pip install .

setup.py的目录中。一切正常,我可以在...\Anaconda3\Lib\site-packages\nsp\A 下找到包的所有文件,包括*.pxd 文件。

现在我寻求为extension2 创建一个*.cpp 文件,以便稍后将其打包到第二个包B 中。文件extension2.pxd 读取

from nsp.A.extension cimport mymethod

创建*.cpp 文件的脚本读取

from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy as np
import sys
print(sys.executable)

NAME = 'extension2'
extensions = [Extension(NAME, [NAME+'.pyx'],
                        include_dirs=[np.get_include()]
                        )
              ]

setup(name=NAME,
      ext_modules = cythonize(extensions, language="c++", 
                              compiler_directives=compiler_directives),
      include_dirs=[np.get_include()]
      ) 

当我使用 python myscript build_ext --inplace 运行此脚本时,我收到一条错误消息,指出缺少 pxd 文件:

from nsp.A.extension cimport mymethod
^
------------------------------------------------------------

.\extension2.pxd:11:0: 'nsp\A\extension.pxd' not found

但是,该文件确实存在。 (sys.executable 是包含已安装包的Anaconda3 文件夹)我该如何解决这个问题?

其他信息

我在 Windows x64 上使用 python 3.7

【问题讨论】:

  • 你确定 pip 是正确的 pip 吗? IE。 python3.7的pip而不是python 2?
  • 否则检查setup.py中的python路径
  • @ead 我确定我使用的是正确的 Python 安装。我只有一个安装,并且导入编译文件(不是 pxd)效果很好。出于同样的原因,我相信 setup.py 中的路径是正确的。

标签: python cython python-packaging python-extensions cythonize


【解决方案1】:

Cython 目前还不支持 implicit namespace packages。也就是说,cython 仅搜索包含文件init.* 的子目录,其中* 可以是pypycpyxpxd 中的任何内容。

我创建了一个bugtracker report for this issue,以防您想跟进该问题是否已在较新版本中得到修复(我使用 Cython 0.29.14)。

在此之前,解决方法是在文件夹 nsp 中创建一个空文件 __init__.pxd。这个文件应该被 python 忽略,因为它不是 *.py 文件,并且让 cython 搜索包的子目录。然后文件结构如下:

├── nsp
│   ├── __init__.pxd
│   └── A
|       ├── extension.pxd
|       ├── extension.pyx
│       └── __init__.py
└── setup.py

要在命名空间包中安装附加文件__init__.pxd,请将setup(...)packages 参数更改为packages=['nsp', 'nsp.A'],并将package_data 参数更改为package_data={'': ['*.pxd', '*.pyx']}

编辑:

该错误已为 cython 开发人员所知,将在版本 3 中修复。请参阅 Fix for cimport from PEP420 namespace

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2021-07-17
    相关资源
    最近更新 更多