Python 未找到包:*.pxd文件的Cython C级接口

Python 未找到包:*.pxd文件的Cython C级接口,python,cython,python-packaging,python-extensions,cythonize,Python,Cython,Python Packaging,Python Extensions,Cythonize,简而言之 我尝试编译一个名为extension2的cython扩展名,它从一个自建包中导入一个文件扩展名。在构建extension2时,我得到一个错误,即未找到extension.pxd,尽管该文件正好位于指定的路径 详细信息 我正在构建两个涉及cython的包,一个包a和一个包B,这取决于aA是名称空间包nsp的子包。也就是说,文件夹结构如下所示: ├── nsp │ └── A | ├── extension.pxd | ├── extension.pyx │

简而言之

我尝试编译一个名为
extension2
的cython扩展名,它从一个自建包中导入一个文件
扩展名
。在构建
extension2
时,我得到一个错误,即未找到
extension.pxd
,尽管该文件正好位于指定的路径

详细信息

我正在构建两个涉及cython的包,一个包
a
和一个包
B
,这取决于
a
A
是名称空间包
nsp
的子包。也就是说,文件夹结构如下所示:

├── nsp
│   └── A
|       ├── extension.pxd
|       ├── extension.pyx
│       └── __init__.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']
    },
)
├── nsp
│   ├── __init__.pxd
│   └── A
|       ├── extension.pxd
|       ├── extension.pyx
│       └── __init__.py
└── setup.py
此处,
setup.py
内容如下:

├── nsp
│   └── A
|       ├── extension.pxd
|       ├── extension.pyx
│       └── __init__.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']
    },
)
├── nsp
│   ├── __init__.pxd
│   └── A
|       ├── extension.pxd
|       ├── extension.pyx
│       └── __init__.py
└── setup.py
设置文件的灵感来自和。cython文件已使用另一个脚本成功转换为
.cpp
文件

我使用安装包
A

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

现在,我试图为
扩展2
创建一个
*.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\u 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,Cython目前还不支持。也就是说,cython只搜索包含文件
init.*
的子目录,其中
*
可以是
py
pyc
pyx
pxd
中的任何内容

我已经创建了一个,以防您希望跟进问题是否已在更新版本中得到修复(我使用Cython 0.29.14)

在此之前,一种解决方法是在文件夹
nsp
中创建一个空文件
\uuu init\uuuu.pxd
。python应该忽略此文件,因为它不是
*.py
文件,并允许cython在子目录中搜索包。文件结构如下所示:

├── nsp
│   └── A
|       ├── extension.pxd
|       ├── extension.pyx
│       └── __init__.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']
    },
)
├── nsp
│   ├── __init__.pxd
│   └── A
|       ├── extension.pxd
|       ├── extension.pyx
│       └── __init__.py
└── setup.py
要在名称空间包中安装附加文件
\uuuu init\uuuuuuuu.pxd
,请将
setup(…)
packages
参数更改为
packages=['nsp',nsp.A']
,并将
package\u data
参数更改为
package\u data={':['*.pxd','*.pyx']}

编辑:


cython开发人员已经知道这个bug,并将在版本3中修复。请参阅。

您确定pip是正确的pip吗?也就是说,pip用于python3.7而不是Python2?否则,请在安装程序中检查python路径。py@ead我确信我使用的是正确的Python安装。我只有一次安装,导入编译文件(不是pxd)效果很好。出于同样的原因,我相信setup.py中的路径是正确的。