关于python:如何从不同的子模块导入一个子模块?

How to import one submodule from different submodule?

本问题已经有最佳答案,请猛点这里访问。

我的项目具有以下结构:

1
2
3
4
5
6
7
DSTC/
    st/
        __init__.py
        a.py
        g.py
        tb.py
    dstc.py

这是a.py的一部分:

1
2
3
import inspect
import queue
import threading

这是tb.py的一部分:

1
2
import functools
from . import a

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

1
2
3
4
5
6
7
"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而不会引起错误?


要么你可以用

1
import a

或相对

1
from .a import *

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

1
python -m a tb.py

会为你工作的。

import * is discouraged, import just as you need

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

1
2
#  main.py
from st import tb

你只运行main.py相对方法就可以了。

1
2
3
# tb.py
import a  # will not work
from .a import * # will work

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


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

正如其他人所说,简单地说,cx1〔6〕将起作用。不管st是作为模块还是脚本运行,这都有利于工作,但这是一种不好的做法,只能在python 2上工作,而不能在python 3上工作。

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


您只需要导入模块a

1
import a