简而言之
我尝试编译一个名为extension2
的cython扩展,它从一个自建包中导入一个文件extension
。在构建extension2
时,我得到一个错误,即extension.pxd
找不到,尽管这个文件正好位于指定的路径。你知道吗
细节
我正在构建两个涉及cython的包,一个包A
和一个依赖于A
的包B
。A
是命名空间包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-numpy和distributing-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
Cython目前还不支持implicit namespace packages。也就是说,cython只搜索包含文件
init.*
的子目录,其中*
可以是py
、pyc
、pyx
和pxd
中的任何内容。你知道吗我已经创建了一个bugtracker report for this issue,以防您想进一步了解这个问题是否在更新的版本中得到了解决(我使用的是cython0.29.14)。你知道吗
在此之前,解决方法是在
nsp
文件夹中创建一个空文件__init__.pxd
。python应该忽略这个文件,因为它不是*.py
文件,让cython在子目录中搜索包。文件结构如下:要在命名空间包中安装附加文件
__init__.pxd
,请将setup(...)
的packages
参数更改为packages=['nsp', 'nsp.A']
,package_data
参数更改为package_data={'': ['*.pxd', '*.pyx']}
。你知道吗编辑:
cython开发人员已经知道这个bug,将在版本3中修复。见Fix for cimport from PEP420 namespace。你知道吗
相关问题 更多 >
编程相关推荐