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中的路径是正确的。