gpt4 book ai didi

python - 如何从python中的父文件夹导入依赖的cython模块

转载 作者:行者123 更新时间:2023-11-30 04:43:43 25 4
gpt4 key购买 nike

设想以下文件夹结构:

/project
run.py
/Helper
Helper.pxd
Helper.pyx
setup.py
/Settings
Settings.pxd
Settings.pyx
setup.py

Helper 使用 Settings.pxd 中定义的类型 Settings 和 PySettings。因此在 Helper.pxd 中我正在做:

from Settings cimport Settings, PySettings

在我放的Helper目录下的setup.py中

include_path=[".", "../Settings/"]

在 cythonize 命令中。因此 Helper 知道设置和编译的所有内容。

在 run.py 中,我想导入 Settings 和 Helper。设置导入工作正常,但在执行时

import Helper.Helper

我收到以下错误:

Traceback (most recent call last):
File "run.py", line 1, in <module>
import Helper.Helper
File "../Settings/Settings.pxd", line 6, in init Helper
AttributeError: module 'Settings' has no attribute 'PySettings'

只要一切都在同一个目录中,这个问题就会消失。

为了完整起见,您将在下面找到完整的代码:

/项目/run.py

import Settings.Settings as S
import Helper.Helper as H

settings = S.PySettings()
settings.doSomething()

H.PyMyFunction(settings)

/project/Helper/Helper.pxd

from Settings cimport Settings, PySettings

cdef extern from "../../cppCode/Helper/Helper.h":
void myFunction(Settings settings)

/project/Helper/Helper.pyx

#distutils: sources = [../../cppCode/Helper/Helper.cpp, ../../cppCode/Settings/Settings.cpp]
#distutils: language = c++

def PyMyFunction(PySettings settings):
myFunction(settings.c_settings)

/project/Helper/setup.py

from distutils.core import setup
from Cython.Build import cythonize
from setuptools.extension import Extension

extensions = [
Extension("Helper", ["Helper.pyx"])
]

setup(ext_modules=cythonize(extensions, include_path=[".", "../Settings/"]))

/project/Settings/Settings.pxd

cdef extern from "../../cppCode/Settings/Settings.h":
cdef cppclass Settings:
Settings() except +
void doSomething()

cdef class PySettings:
cdef Settings c_settings

/project/Settings/Settings.pyx

#distutils: sources = ../../cppCode/Settings/Settings.cpp
#distutils: language = c++

cdef class PySettings:
def __cinit__(self):
self.c_settings = Settings()

def doSomething(self):
self.c_settings.doSomething()

/project/Settings/setup.py

from distutils.core import setup
from Cython.Build import cythonize
from setuptools.extension import Extension

extensions = [
Extension("Settings", ["Settings.pyx"])
]

setup(ext_modules=cythonize(extensions))

最佳答案

include_path”用于 C 包含。它对 Python 查找 pxd 文件的位置没有影响。

您通常需要一个设置文件,位于顶层。一个更好的方法可能是:

setup.py
project/
run.py
__init__.pxd
Settings/
__init__.pxd
Settings.pyx/pxd
Helper/
__init__.pxd
Helper.pyx/pxd

这将创建一个名为“package”的模块,所有模块将同时构建和安装。安装后,您的用户将能够执行 from project import whatever

你会注意到我添加了一些 __init__.pxd files .它们与 __init__.py 文件的用途基本相同,除了它们将文件夹标识为 Cython 的 cimport 机制的(子)包。

Helper .pxd 然后开始:

from project.Settings.Settings cimport Settings, PySettings

我使用了完整导入而不是相对导入,因为 cimport 和相对导入似乎有点不可靠。

Setup.py如下:

from setuptools.extension import Extension
from setuptools import setup
from Cython.Build import cythonize

ext_modules = cythonize("project/*/*.pyx")

setup(ext_modules=ext_modules)

欢迎您明确使用Extension,但对于一些简单的事情,将文件模式直接发送到 cythonize 似乎更容易。


我只测试了它的 Cythonize 阶段,因为我没有编译和运行它所需的 C++ 文件。

关于python - 如何从python中的父文件夹导入依赖的cython模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58083432/

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