3

我正在开发一个 Python 程序,它管理和运行模块( .py python 文件),用户可以添加这些模块,并使用导入函数将其导入主程序( 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 导入 o​​utput.py 时

from ..src.output import *

我得到错误

ValueError: Attempted relative import beyond toplevel package

我将文件放在不同的目录中,因为它使不同的程序员更容易单独编码,我肯定需要一个文件夹“模块”或可以添加 .py 模块文件并在 bar.py 中使用其功能的东西

如果我做错了,请告诉我。并随时提出更好的方法来做到这一点。

谢谢你。

4

1 回答 1

4

问题是因为Foohas no __init__.py,所以它不被认为是一个包。

相对导入中的每个句点都指向一个包。当你这样做

from ..src.output import *

bar.py中,第一个周期是指当前包,modules。第二个时期是指上面那个包,Foo. 由于Foo实际上不是一个包,因此您会收到错误消息。

PS 通配符导入是不受欢迎的。尤其是当您从像这样远相关的包中导入时,我会尝试将其重构为显式导入。

于 2013-04-27T17:16:03.787 回答