从另一个目录导入 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
,否则,它允许其他人找到它。
我有一个 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
,否则,它允许其他人找到它。