我有一个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)
发生了什么事?
答案 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
,如果没有,则允许其他人找到它。