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

Noc*_*wer 6 python reference exception python-import python-3.x

我的项目具有以下结构:

DSTC/
    st/
        __init__.py
        a.py
        g.py
        tb.py
    dstc.py
Run Code Online (Sandbox Code Playgroud)

这是a.py部分:

import inspect
import queue
import threading
Run Code Online (Sandbox Code Playgroud)

这是tb.py部分:

import functools
from . import a
Run Code Online (Sandbox Code Playgroud)

直接运行时,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
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*jik 3

你可以使用

import a
Run Code Online (Sandbox Code Playgroud)

或亲戚

from .a import *
Run Code Online (Sandbox Code Playgroud)

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

python -m a tb.py
Run Code Online (Sandbox Code Playgroud)

将为你工作。

不鼓励 import *,根据需要导入

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

#  main.py
from st import tb
Run Code Online (Sandbox Code Playgroud)

并且您运行 main.py 只有相对方法才适合您

# tb.py 
import a  # will not work
from .a import * # will work
Run Code Online (Sandbox Code Playgroud)

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