如何从上面的嵌套文件夹中正确导入?
How to import properly from the nested folder above?
我有以下结构:
/a
/b
module1.py
/c
module2.py
因此,从某个根文件夹中有 2 个模块:
a/b/module1.py 和
c/module2.py
我想从模块 2 导入模块 1 的一些功能。
所有 3 个文件夹都有 ____init___.py
两个py文件里面都有:
if __name__ == '__main__':
func()
module2.py 具有以下导入代码:
from .. a.b.module1 import func1
如果我只是 运行 module2.py 从终端(留在根文件夹中):
python -m c.module2.py
我有以下错误:
ValueError: attempted relative import beyond top-level package
如何解决这个问题?
这是 python 导入系统的一个常见问题,但使其更易于管理的一种方法可能是在项目根目录的另一个 __init__.py
中定义一些导入,这将创建您的包和所有子目录的单独命名空间。
我设置目录以重现您的错误的方式是这种结构:
根目录:/package
:
/package
/package/__init__.py
/package/a
/package/a/__init__.py
/package/a/b
/package/a/b/__init__.py
/package/a/b/module1.py
/package/c
/package/c/__init__.py
/package/c/module2.py
在package/__init__.py
中放置顶级模块导入:
from a.b import module1
然后我所做的唯一更改是 module2.py
仅包含此函数用于测试:
from package import a # import top-level module from root package
def func():
a.b.module1.some_object() # call function of module1 from module2 (this module).
if __name__ == '__main__':
func()
然后在包的顶级根目录中,您应该可以从终端 运行 module2.py
:
$ python package/c/module2.py
应该打印出来:
from a.b.module1: some object
可以进行改进和改进以获得您想要的确切行为。
作为参考,我使用了这个答案的建议:How to avoid circular imports in Python?
我有以下结构:
/a
/b
module1.py
/c
module2.py
因此,从某个根文件夹中有 2 个模块:
a/b/module1.py 和
c/module2.py
我想从模块 2 导入模块 1 的一些功能。
所有 3 个文件夹都有 ____init___.py
两个py文件里面都有:
if __name__ == '__main__':
func()
module2.py 具有以下导入代码:
from .. a.b.module1 import func1
如果我只是 运行 module2.py 从终端(留在根文件夹中):
python -m c.module2.py
我有以下错误:
ValueError: attempted relative import beyond top-level package
如何解决这个问题?
这是 python 导入系统的一个常见问题,但使其更易于管理的一种方法可能是在项目根目录的另一个 __init__.py
中定义一些导入,这将创建您的包和所有子目录的单独命名空间。
我设置目录以重现您的错误的方式是这种结构:
根目录:/package
:
/package
/package/__init__.py
/package/a
/package/a/__init__.py
/package/a/b
/package/a/b/__init__.py
/package/a/b/module1.py
/package/c
/package/c/__init__.py
/package/c/module2.py
在package/__init__.py
中放置顶级模块导入:
from a.b import module1
然后我所做的唯一更改是 module2.py
仅包含此函数用于测试:
from package import a # import top-level module from root package
def func():
a.b.module1.some_object() # call function of module1 from module2 (this module).
if __name__ == '__main__':
func()
然后在包的顶级根目录中,您应该可以从终端 运行 module2.py
:
$ python package/c/module2.py
应该打印出来:
from a.b.module1: some object
可以进行改进和改进以获得您想要的确切行为。
作为参考,我使用了这个答案的建议:How to avoid circular imports in Python?