从不同包的 Python 个文件中导入 Cython 模块

import Cython modules in Python files from different packages

我在与其他 python 包分开的包中创建并构建了一个 Cython 文件,该项目具有以下目录结构,

pack1
    pack1.1
        cython_file.pyx
        setup.py
pack2
    main_python.py

pyx 文件一起,还有一个名为 build 的包和一个 pyd 文件在构建 Cython 文件后生成。

setup.py 看起来像,

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("cython_file.pyx")
)

我在main.py中导入cython_file,喜欢

from pack1.pack1.1.cython_file import cython_func

但出现错误:

ImportError: No module named 'pack1.pack1.1.cython_file'

如何解决这个问题?

最初,您不应命名文件夹 pack1.1。在此处使用 . 将使 python 搜索名称为 1 的包(在 import 语句中用点分隔包);由于 Python 语法不允许名称以数字开头,因此您会遇到语法错误。选择一个像 pack1_1.

这样的名字

现在,尝试从同级目录 import 比较棘手,不建议;您最好的选择是将 main_python.py 移动到顶级目录中,如果它是 main 脚本,它应该存在于那里。您的结构应如下所示:

pack1
    pack1_1
        cython_file.pyx
        setup.py
main_python.py

正在执行main_python.py:

from pack1.pack1_1.cython_file import cython_func
cython_func()

cython_file.pyx 的:

cpdef cython_func():
    print("Cython Function Called")

得到想要的结果。


如果您确实需要该目录结构,则需要通过将顶级目录添加到 sys.path:

来部署一些技巧
import sys, os
sys.path.insert(0, os.path.abspath(".."))
from pack1.pack1_1.cython_file import cython_func

cython_func()

但这很丑陋,你找不到人推荐它。