如何从不同的子模块导入一个子模块? [复制]

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不会出错,很容易验证没有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

我应该如何重写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 变体。

【讨论】:

以上是关于如何从不同的子模块导入一个子模块? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何以角度将组件从一个模块导出和导入到它的子模块

从不同子文件夹的子文件夹相对导入python模块

从字符串变量导入模块

如何从 Python 中的子文件夹导入模块或文件?

单元测试iOS中的子模块静态函数? (斯威夫特 4 - Xcode)

如何在模块化的angularjs范围内测试指令?