gpt4 book ai didi

python - 找不到包: *. pxd文件的Cython C级接口(interface)

转载 作者:行者123 更新时间:2023-12-04 12:19:42 26 4
gpt4 key购买 nike

简而言之

我尝试编译一个名为 extension2 的 cython 扩展cimports 文件 extension来自自创建的包。建时extension2 , 我得到了 extension.pxd 的错误尽管此文件正好位于指定的路径中,但未找到。

详情

我正在构建两个涉及 cython 的包,一个包 A和一个包裹B这取决于 A . 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-numpydistributing-cython-modules . cython 文件已经成功转换为 .cpp文件与另一个脚本。

我安装了包 A
pip install .

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

现在我寻求创建一个 *.cpp extension2 的文件以便稍后在第二个包中打包 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

最佳答案

Cython 不支持 implicit namespace packages到目前为止。也就是说,cython 只搜索包含文件 init.* 的子目录。 , 由此 *可以是 py 中的任何内容, pyc , pyx , 和 pxd .

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

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

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

安装附加文件 __init__.pxd在命名空间包中,更改 packages setup(...) 的论据至 packages=['nsp', 'nsp.A']package_data论据 package_data={'': ['*.pxd', '*.pyx']} .

编辑:

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

关于python - 找不到包: *. pxd文件的Cython C级接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59545750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com