Python-相对导入
我正在开发一个Python程序,它在其中管理和运行模块(.py Python文件),这些模块可以由用户添加,并通过使用import函数导入主程序(foo.py)。这是目录结构Python-相对导入,python,import,Python,Import,我正在开发一个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.p
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
我可以使用
from src.output import *
但我面临的问题是,当我尝试使用
from ..src.output import *
我得到了错误
ValueError: Attempted relative import beyond toplevel package
我将文件放在不同的目录中,因为这使不同的程序员更容易单独编写代码,我肯定需要一个文件夹“modules”或一些可以添加.py模块文件并在bar.py中使用其功能的地方
如果我做错了,请告诉我。并且可以自由地提出更好的方法
谢谢。问题是因为
Foo
没有\uuu init\uuu.py
,所以它不被视为包
相对导入中的每个期间都引用一个包。当你这样做的时候
from ..src.output import *
在bar.py
中,第一个句点指的是当前包modules
。第二个句点是指上面的包,Foo
。因为Foo
实际上不是一个包,所以会出现一个错误
p.S.通配符导入是不受欢迎的。特别是当您从这样一个远亲的包导入时,我会尝试将其重构为显式导入。导入都是相对于顶层的。src.output在Foo/src/output中查找。。由于无法在项目外部导入,因此src.output尝试超出Foo,此时库将中断。当我从foo.bar导入时,您应该将想要的模块添加到其他目录结构中,或者更改classpathAah。。不需要。谢谢但是有更好的方法吗?谢谢。但是你能不能更清楚一点关于显式导入?也许可以举个例子?@GrimReaper explicit import意味着您不应该使用
import*
,而是应该明确地说明您要导入的内容,比如从mymodule import myfunc、myclass导入的,谢谢。是否应该对我的目录结构进行任何修改?那么,为Foo
提供一个`init.py`文件以使相对导入工作正常(即使它不是真正的包),这会不会太错误?