从同级文件夹导入模块

时间:2019-06-27 08:23:35

标签: python import

我在存储库中有一个python项目,需要从其他存储库中导入一些类。 由于它们是不同的存储库,因此它们需要保持在同一目录级别。

像这样的文件夹结构:

repos
    |- my_project 
         |- main.py
    |- foo_folder
         |- foo.py
    |- bar_folder
         |- bar.py

myproject/main.py中,我需要从Foo_Class导入类foo_folder/foo.py,并从Bar_Class导入bar_folder/bar.py

一种这样做的方法是:

import sys
sys.path.insert(0, '../foo_folder')
sys.path.insert(0, '../bar_folder')

那我就可以做

from foo_folder.foo import Foo_Class
from bar_folder.bar import Bar_Class

但是我不是这个解决方案的特别拥护者,也不是PEP8编译器:

PEP8: module level import not at top of file

我还可以在my_project中创建foo的快捷方式和bar的快捷方式,因此系统会将这些模块视为子文件夹。

但是,这看起来又像是骇客,我必须将此快捷方式添加到.gitignore,在Windows中根本无法使用!

我不知道为什么,但是如果我物理上复制foo文件夹并将其命名为copy_of_foo_folder,则可以导入它,但是如果我创建了foo的快捷方式,则无法导入。

 |- my_project 
             |- shortcut_to_foo_folder
             |- copy_of_foo_folder
             |- main.py

from copy_of_foo_folder.foo import Foo   # WORKS
from shortcut_to_foo_folder.foo import Foo   # FAILS

ModuleNotFoundError: No module named 'shortcut_to_foo_folder'

所以我的问题是。导入不在子文件夹中但在相同层次结构级别的模块的标准方法是什么?

1 个答案:

答案 0 :(得分:0)

您必须在每个目录中包含__init__.py

repos
    |- my_project 
         |- main.py
         |- __init__.py
    |- foo_folder
         |- foo.py
         |- __init__.py
    |- bar_folder
         |- bar.py
         |- __init__.py
    __init__.py

请查看我以前对__init__.py中包含的内容的回答:https://stackoverflow.com/a/56732285/7994074