我想从子包导入模块,所以我去了这里从父文件夹子文件夹相对导入模块,由于它不起作用,我阅读了堆栈上的所有文献,发现了一个可以重现但无法解决的较小问题。
我想使用相对导入,因为我不想处理 sys.path 等,并且我不想安装项目的每个模块以在任何地方导入。我想让它与相对导入一起工作。
我的项目结构:
project/
__init__.py
bar.py
foo.py
main.py
bar.py:
from .foo import Foo
class Bar():
@staticmethod
def get_foo():
return Foo()
foo.py:
class Foo():
pass
main.py:
from bar import Bar
def main():
f = Bar.get_foo()
if __name__ == '__main__':
main()
我正在使用
python main.py
从终端运行项目代码,我得到以下信息:
Traceback (most recent call last):
File "**omitted** project/main.py", line 1, in <module>
from bar import Bar
File "**omitted** project/bar.py", line 1, in <module>
from .foo import Foo
ImportError: attempted relative import with no known parent package
为什么我会收到此错误?看来 bar 无法将项目识别为父包,但是:
__init__.py
就位bar.py
正在作为模块而不是脚本运行,因为它是从 main 调用而不是从命令行调用(因此 __package__
和 __name__
应该就位以帮助解决相对导入 十亿的相对导入时间)为什么我会收到此错误?我错了什么?我已经工作了一段时间,只是将 cwd 的父级添加到 PYTHONPATH 中,但我想一劳永逸地解决这个问题。
我建议查看这个关于 python3 中的相对导入的帖子。我能够通过两种不同的方式让您的导入工作:
更新结构:
main.py
project/
__init__.py
bar.py
foo.py
main.py:
from project.bar import Bar
def main():
f = Bar.get_foo()
if __name__ == '__main__':
main()
PYTHONPATH
main.py:
import sys
import os
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(SCRIPT_DIR))
from project.bar import Bar
def main():
f = Bar.get_foo()
if __name__ == '__main__':
main()