如何从不同的子模块导入一个子模块? [复制]
Posted
技术标签:
【中文标题】如何从不同的子模块导入一个子模块? [复制]【英文标题】: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
不会出错,很容易验证没有SyntaxError
s。但是,运行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
可以直接运行而不会导致错误?
【问题讨论】:
【参考方案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
变体。
【讨论】:
以上是关于如何从不同的子模块导入一个子模块? [复制]的主要内容,如果未能解决你的问题,请参考以下文章