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

dai*_*yue 5 cython python-import python-3.x

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

pack1
    pack1.1
        cython_file.pyx
        setup.py
pack2
    main_python.py
Run Code Online (Sandbox Code Playgroud)

除了该pyx文件之外,还有一个名为的包build以及pyd在构建该文件后生成的文件Cython

看起来setup.py

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

setup(
    ext_modules=cythonize("cython_file.pyx")
)
Run Code Online (Sandbox Code Playgroud)

我导入cython_filemain.py就像

from pack1.pack1.1.cython_file import cython_func
Run Code Online (Sandbox Code Playgroud)

但出现错误:

ImportError: No module named 'pack1.pack1.1.cython_file'
Run Code Online (Sandbox Code Playgroud)

如何解决问题?

Jim*_*ard 5

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

现在,尝试import从同级目录进行操作相对比较棘手,因此不建议这样做;您最好的选择是将其移动main_python.py到顶级目录中,如果它是脚本,它应该存放在那里。你的结构应该是这样的:

pack1
    pack1_1
        cython_file.pyx
        setup.py
main_python.py
Run Code Online (Sandbox Code Playgroud)

现在执行main_python.py

from pack1.pack1_1.cython_file import cython_func
cython_func()
Run Code Online (Sandbox Code Playgroud)

cython_file.pyx

cpdef cython_func():
    print("Cython Function Called")
Run Code Online (Sandbox Code Playgroud)

得到想要的结果。


如果您确实需要具有该目录结构,则需要通过将顶级目录添加到来部署一些技巧sys.path

import sys, os
sys.path.insert(0, os.path.abspath(".."))
from pack1.pack1_1.cython_file import cython_func

cython_func()
Run Code Online (Sandbox Code Playgroud)

但这很丑陋,你不会发现有人建议它。