我正在开发一个Python程序,它管理和运行模块(.py python文件),这些模块可以由用户添加并通过import函数导入主程序(foo.py)。这是目录结构
Foo/
foo.py #Main script. Imports ouput.py, core.py and bar.py when needed.
src/
__init__.py
output.py #Output functions required by bar.py and foo.py
core.py
modules/
__init__.py
bar.py #Needs output.py
我可以使用
导入foo.py.from src.output import *
但我遇到的问题是当我尝试使用
从bar.py导入output.py时from ..src.output import *
我收到错误
ValueError: Attempted relative import beyond toplevel package
我将文件放在不同的目录中,因为它使不同的程序员更容易单独编码,我肯定需要一个文件夹'modules'或者可以添加.py模块文件并在bar中使用其功能的东西。 py
如果我做错了,请告诉我。并随意提出一个更好的方法来做到这一点。
谢谢。
答案 0 :(得分:4)
问题是因为Foo
没有__init__.py
,所以它不被视为包。
相对导入中的每个句点都指包。当你这样做
from ..src.output import *
在bar.py
中,第一个句点指的是当前包modules
。第二个时期是指Foo
之上的包。由于Foo
实际上不是包,因此会出错。
P.S。通配符导入不受欢迎。特别是当您从这样一个远程相关的包中导入时,我会尝试将其重构为显式导入。