【问题标题】:Importing another module from another subdirectory of the current directory's parent directory (python)从当前目录的父目录的另一个子目录导入另一个模块(python)
【发布时间】:2012-07-04 22:00:01
【问题描述】:

我正在尝试编写游戏。因此,我有很多不同类型的代码,并希望将它们排列在一个有用的层次结构中。

我查看了涉及在每个文件夹中放置 __init__.py 的解决方案,但我仍然有些困惑,尽管不如 python 解释器那么多。

现在假设resource1.py 想要从physics1.py 导入一个函数,或者实际上是Game 目录中的任何其他.py 文件,我该怎么做呢?

我已经尝试过from bin.physics.physics1 import function,但显然这不起作用。

感谢您的帮助。

/Game
    launcher.py
    /bin
        game.py
        __init__.py
        /physics
            __init__.py
            physics1.py
            physics2.py
    /resources
        __init__.py
        resource1.py

【问题讨论】:

    标签: python import module path


    【解决方案1】:

    除非您将Game 制作成一个包(即,通过将__init__.py 放入Game 目录中),否则使用普通导入机制是不可能的。 python 相对导入系统仅适用于包内。它不是通过目录结构中的位置来引用任意模块的通用系统。如果你把 Game 做成一个包,那么你可以做from ..bin.physics.physics1 import function

    编辑:另请注意,相对导入在作为主程序执行的脚本中不起作用。如果您尝试直接运行 resource.py 并且它使用相对导入,您将收到“在非包中尝试相对导入”错误。如果您从另一个模块导入资源,它将起作用。这是因为相对导入系统基于执行模块的“名称”,当您直接运行脚本时,它的名称是__main__,而不是通常的名称。如果您确实需要,可以使用the __package__ keyword 解决此问题,但这可能有点棘手。

    【讨论】:

    • 我已将__init__.py 文件放入Game,但我仍然得到ImportError: No module named physics.physics1
    • 我刚刚用那个目录结构测试了它,它工作正常。您确定目录结构如您所说,并且每个目录中都有__init__.py吗?
    • 天哪,我忘了在最后一个目录中添加__init__.py。所以它现在可以从launcher.py 工作,但从resource1.py 我得到ValueError: Attempted relative import in non-package
    • 查看我编辑的回复。相对导入在您直接执行的文件中不起作用;它们只能在导入的模块中工作。如果您从其他地方导入资源,它应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 2015-07-23
    • 2020-09-18
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    相关资源
    最近更新 更多