【问题标题】:not able to access the modules using relative imports无法使用相对导入访问模块
【发布时间】:2024-01-12 17:14:01
【问题描述】:

我的文件夹结构如下

mypackage/
    __init__.py
    package1/
        __init__.py
        module1.py        # has ClassOne 
        module2.py        # has ClassTwo
        script.py
    package2/
        __init__.py
        module3.py        # has ClassThree
        module4.py        # has ClassFour

script.py 我想从module4 访问ClassFour,所以我使用如下的相对导入

from ..module4 import ClassFour

c = ClassFour()

但我遇到了错误

ValueError:尝试相对导入超出*包

我知道我可以用

解决这个问题
import sys

sys.path.append("path/to/my/module/")

但我对相对进口的解决方案感兴趣。

我提出了几个问题并尝试了解决方案,例如 - How to do relative imports

并且还尝试使用

运行我的文件

python -m 脚本

但没有成功

【问题讨论】:

  • 你可以把script.py放在你的包的顶层。或者您可以通过from mypackage.package2.module4 import ClassFour 从已安装的包中导入。另请注意,from ..module4 import ClassFour 在任何情况下都不会成功,因为这样的模块不存在。它应该是from ..package2.module4 import ClassFourfrom ..package2 import ClassFour,如果你将它导入__init__.py

标签: python python-3.x python-import


【解决方案1】:

你只需要在调用module4之前调用package2,

从 ..package2.module4 导入 ClassFour

作为使用单..您可以跳出package1但无法访问package2及其文件。

例如,您可以查看以下结构。

调用文件内容:

package1/module2.py contains a function, function1.
package2/__init__.py contains a class, class1.
package2/subpackage1/module5.py contains a function, function2.

您可以通过这种方式将class1和function2导入到package2/module3.py文件中:

from . import class1
from .subpackage1.module5 import function2

如需更多参考,您可以访问此链接:Reference

【讨论】:

    【解决方案2】:

    要在包内运行脚本,您可以:

    python -m mypackage.package1.script
    

    如果您没有安装软件包(例如通过 pip),那么您需要从 mypackage 的父目录调用该命令(否则任何目录都可以)。

    为此,您还需要更正您正在使用的导入。目前..module4 不指向现有模块。相反,它应该是

    from ..package2.module4 import ClassFour
    

    或者如果您在package2/__init__.py 中导入了ClassFour,那么您也可以这样做:

    from ..package2 import ClassFour
    

    【讨论】:

    • 感谢它在我使用python -m mypackage.package1.script 运行命令时有效,但是如何通过 pip 安装包以从其他目录运行
    • @AkshayNevrekar 您基本上需要创建一个包含相关信息的setup.py 文件。然后你可以通过pip install .mypackage的父目录安装。你可以找到更多from the docs