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

时间:2016-06-02 10:52:10

标签: python-3.x cython python-import

我在与其他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")
)

我在cython_file中导入main.py,例如

from pack1.pack1.1.cython_file import cython_func

但收到了错误:

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

如何解决问题?

1 个答案:

答案 0 :(得分:1)

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

现在,从兄弟目录尝试import相对棘手而且没有建议;您最好的选择是将main_python.py移到顶级目录中,如果它是脚本,它应该存在那里。您的结构应如下所示:

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()

但这很丑陋,你找不到人们的建议。