如何从不同的子模块导入一个子模块?

How to import one submodule from different submodule?

我的项目结构如下:

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不报错,很容易验证没有SyntaxError。但是,运行ning 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

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

您只需要导入模块 a

import a

你可以使用

import a

或亲戚

from .a import *

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

python -m a tb.py

适合你。

import * is discouraged, import just as you need

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

#  main.py
from st import tb

你 运行 main.py 只有相对的方法才适合你

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

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

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

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

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