从另一个目录导入 Cython 暴露 class

Import Cython exposed class from another directory

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

在这个包的__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

我得到的错误可以追溯到 same __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)

怎么回事?

我认为这与 Cython 本身没有任何关系,而是因为当您在顶级目录中执行 main.py 时, Python 将执行 __init__.py 并在同一目录中搜索,但未能在 qux 中找到 foo 模块。

作为解决方案,将__init__.py中的import语句改为:

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会找到foo,否则,它允许其他人找到它。