从另一个目录导入Cython公开的类

时间:2016-06-14 17:33:32

标签: python cython python-import

我有一个Python项目,我想在其中使用我通过Cython公开的C++类(实际上,我只需要该类的特定实例,如下面的代码所示)。因为有一堆与该类相关联的文件,所以我决定把它放在自己的包中。

在此软件包的__init__.py文件中,我有以下代码:

from foo import Foo  # import the class

bar = Foo(some_parameters)
__all__ = ["bar"]

当我单独运行__init__.py时,这样可以正常工作。但是,当我尝试从目录外部访问它时:

from qux import bar  # inside main.py in the parent directory

我将错误追溯到相同的 __init__.py

File "D:\path\to\qux\\__init__.py", line 2, in <module>
from foo import Foo
ImportError: No module named 'foo'

回想一下foo是一个Cython文件,而不是纯Python代码。

目录结构如下所示:

main_project\
  main.py
  (more supporting files here)
  qux\
    __init__.py
    cy_foo.cpp
    cy_foo.pyx
    foo.cpp
    foo.h
    foo.cp35-win_amd64.pyd
    (more supporting files here)

发生了什么事?

1 个答案:

答案 0 :(得分:1)

我认为这与Cython本身没有任何关系,相反,这个问题是由于当您在顶级目录中执行main.py时,{{1} }将执行Python并在同一目录中搜索,无法在__init__.py内找到foo模块。

作为解决方案,请将qux中的import语句更改为:

__init__.py

如果由于某种原因您仍然需要from qux.foo import Foo 作为__init__.py脚本运行,您可以使用非常熟悉的__main__子句来检查if

__name__

现在,如果以if __name__ == "__main__": from foo import Foo else: from qux.foo import Foo bar = Foo("arguments") __all__ = ["bar"] 模块运行,__main__会找到__init__.py,如果没有,则允许其他人找到它。