未找到包:*.pxd文件的Cython Clevel接口

2024-09-30 01:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

简而言之

我尝试编译一个名为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文件夹)如何解决问题?你知道吗

其他信息

我正在Windowsx64上使用Python3.7


Tags: 文件frompyimportbuildnumpyincludesetup
1条回答
网友
1楼 · 发布于 2024-09-30 01:25:46

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

我已经创建了一个bugtracker report for this issue,以防您想进一步了解这个问题是否在更新的版本中得到了解决(我使用的是cython0.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开发人员已经知道这个bug,将在版本3中修复。见Fix for cimport from PEP420 namespace。你知道吗

相关问题 更多 >

    热门问题