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

时间:2017-09-20 16:31:53

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

我的项目具有以下结构:

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。但是,运行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重写tb的导入,以便tb可以直接运行而不会导致错误?

3 个答案:

答案 0 :(得分:0)

你可以使用

import a

或亲戚

from .a import *

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

python -m a tb.py

适合你。

  不建议使用

import *,只需按需导入

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

#  main.py
from st import tb

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

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

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

答案 1 :(得分:-1)

您只需要导入模块a

import a

答案 2 :(得分:-1)

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

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

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