Python-相对导入

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

我正在开发一个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
我可以使用

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`文件以使相对导入工作正常(即使它不是真正的包),这会不会太错误?