【问题标题】:How to import one submodule from different submodule? [duplicate]如何从不同的子模块导入一个子模块? [复制]
【发布时间】:2018-03-01 19:52:29
【问题描述】:

我的项目结构如下:

DSTC/
    st/
        __init__.py
        a.py
        g.py
        tb.py
    dstc.py

这里是a.py的一部分:

import inspect
import queue
import threading

这里是tb.py的一部分:

import functools
from . import a

直接运行a.py不会出错,很容易验证没有SyntaxErrors。但是,运行tb.py 会导致以下错误:

"C:\Program Files\Python36\python.exe" C:/Users/user/PycharmProjects/DSTC/st/tb.py
Traceback (most recent call last):
  File "C:/Users/user/PycharmProjects/DSTC/st/tb.py", line 15, in <module>
    from . import a
ImportError: cannot import name 'a'

Process finished with exit code 1

我应该如何重写a from tb 的导入,以便tb 可以直接运行而不会导致错误?

【问题讨论】:

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


    【解决方案1】:

    您只需要导入模块a

    import a
    

    【讨论】:

    • 嗯,它一个答案,但后来被更详细的答案变得多余。
    【解决方案2】:

    你可以使用

    import a
    

    或相对

    from .a import *
    

    在这种情况下应该加载模块**a**

    python -m a tb.py
    

    对你有用。

    不鼓励导入 *,按需导入

    如果您的 DSTC 中有一个 main.py,如下所示:

    #  main.py
    from st import tb
    

    你运行 main.py 只有相对的方法对你有用

    # tb.py 
    import a  # will not work
    from .a import * # will work
    

    因为这次您将“a”作为模块加载。

    【讨论】:

      【解决方案3】:

      使用import .a,或者更好的是import st.a。这些仅在您将tb 作为包的一部分导入(例如,使用父目录中的python -m 切换)而不是像脚本一样运行它时才有效。

      正如其他人所说,只需import a 即可。无论st是作为模块还是脚本运行,这都具有工作的优势,但这是不好的做法,只适用于python 2,而不适用于python 3。

      这同样适用于其他人提到的from 变体。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-06
        • 1970-01-01
        • 2022-12-10
        • 2016-10-31
        相关资源
        最近更新 更多