【问题标题】:Absolute and relative imports not working for custom package绝对和相对导入不适用于自定义包
【发布时间】:2020-05-02 00:24:36
【问题描述】:

我有一个带有目录结构的包(或者我认为应该是一个包):

Switch/
    tests/
        testing.py
    Sw.py
    #otherfiles

我正在尝试从 testing.py 导入 Sw.py。我尝试了几件事,包括from .. import Swimport ..Swfrom Switch import Sw 和其他几个变体。我已经在 Switch 目录和测试目录中尝试了有和没有 __init__.py 文件的这些。我得到的主要错误是:

Traceback (most recent call last):
  File "tests/testing.py", line 10, in <module>
    from .. import Sw
ImportError: attempted relative import with no known parent package

虽然我在尝试import ..SwModuleNotFoundError: No module named 'Switch' 时也会遇到语法错误,但我在尝试from Switch import Sw 时也会遇到语法错误。

我已尽力确保包中的所有目录都不在路径或 pythonpath 中,尽管我在 WSL 上运行安装在 Windows 上的 Python,因此路径有些复杂。

当我转到 Switch 上方的目录并运行 python -c "import Switch.Sw" 时,它可以正常工作,但在 Switch 目录中它会以 ModuleNotFoundError: No module named 'Switch' 响应

【问题讨论】:

    标签: python import package python-3.8


    【解决方案1】:

    使用这个代码去一个目录,然后你应该可以从你的包中导入

    import os, sys
    dir_path = os.path.dirname(os.path.realpath(__file__))
    parent_dir_path = os.path.abspath(os.path.join(dir_path, os.pardir))
    sys.path.insert(0, parent_dir_path)
    

    我知道这很麻烦,但我不确定是否有更好的解决方案。

    【讨论】:

      【解决方案2】:

      我发现问题在于我将文件作为脚本运行,或者我的命令作为脚本运行。 python -c "import Sw""import Sw" 视为脚本,这就是相对和绝对导入不起作用的原因。它没有将 Sw 视为包的一部分,而只是一个独立的模块。 This Question 为我清理了一切。我应该一直在做python -m Switch.Sw

      【讨论】:

        猜你喜欢
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-08
        • 2011-07-12
        • 2019-05-14
        • 2016-07-19
        • 1970-01-01
        相关资源
        最近更新 更多