如何在与导入模块同名的包中导入 Python 模块?

3
假设我有以下内容(project1在Python路径上):
/project1/utils/utils.py
    def cool_function():
        print "cool"

/project1/backup/utils.py
    from utils.utils import cool_function

出现了“ImportError: No module named utils”错误。

我猜测这是因为它正在backup.utils中搜索utils.cool_function。是否有其他方法而不是重命名utils包?我认为我的命名约定很合理,也很自然,所以我不愿意更改它。但如果这是首选和标准做法,我会考虑将其重命名!

谢谢!

编辑:我正在使用Python 2.7

3个回答

2

您可以使用相对导入

from ..utils.utils import cool_function

这个不行!不确定为什么,我在发布到 Stack Overflow 之前已经尝试过了。 - cammil
我尝试使用Python27,但出现了“ValueError: Attempted relative import beyond toplevel package”的错误。 - David Poole

1
如果project1是一个包(父目录在sys.path上并且有一个__init__.py),您可以执行from project1.utils.utils import cool_function。另请参见PEP328,这是Python 2.5中的新功能。如果您使用的是2.5或更高版本,则from ..utils.utils import cool_function也可能有效。

我也认为这是一个不错的做法。使用project1来区分;project1.utils.utils和project1.backup.utils。如果像你所说的那样,project1在sys.path中,这也将有助于您如果想从其他文件夹运行项目,例如:python folder1/folder2/project1/run.py。 - Bogdan
实际上,/project1/在路径上,因此我可以在导入时直接引用备份或工具。应该将它们放在一个包装器包中吗? - cammil
在许多情况下,这是一个判断性的问题,但通常我会说是的 - 如果您需要将此项目与其他项目集成,如果它们也具有“utils”或“backup”顶级包,则可能会出现问题。这通常不会发生 - 但是出于这个原因。 - AdamKG
我倾向于同意。我把所有东西都放到了一个超级包中,现在感觉好多了。按照建议,使用根包名称(例如project1.utils.utils)导入所有内容,现在一切都正常工作了。谢谢大家。 - cammil

0

对我来说运行良好。

使用以下项目结构:

project/
|-- run.py
`-- utils
|   |-- __init__.py
|   |-- utils.py
|-- backup
    |-- __init__.py
    |-- utils.py

project目录下调用python3 run.py

编辑:抱歉,我刚看到这不适用于python-2.x


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接