【问题标题】:Can't import module from subdirectory无法从子目录导入模块
【发布时间】:2018-10-14 14:40:30
【问题描述】:

在高层次上,我的项目结构如下所示。

dir/
    moduleA/
            __init__.py
            file1.py
            file2.py
    main.py

file2.py 包含一些我在 file1.py 中导入的全局变量

# --- file2.py schema ---

SOME_GLOBAL_VARIABLE = 1

# --- file1.py schema --- 

from moduleA.file2 import SOME_GLOBAL_VARIABLE

class MyClass():
    def __init__(self):
         self.some_attr = SOME_GLOBAL_VARIABLE   

    def run():
         print(self.some_attr)     

当我在下面运行 main.py 时,它创建了一个 MyClass 的实例,代码运行没有错误。

# --- main.py ---

from moduleA.file1 import MyClass

x = MyClass()
x.run()

但是,当我打开一个 Python 控制台并执行以下命令以从 file1.py 导入 MyClass 时,我收到一个导入错误,即没有名为 moduleA 的模块。

from moduleA.file1 import MyClass

# (... some traceback statements)
from moduleA.file2 import SOME_GLOBAL_VARIABLE
ModuleNotFoundError: No module named 'moduleA'

这怎么可能在Python明确找到moduleA/file1.py的时候,否则无法尝试执行该行

from moduleA.file2 import SOME_GLOBAL_VARIABLE

我觉得奇怪的是,当我运行 main.py 脚本时它运行时没有错误。

我想这是由于我对 Python 如何准确地导入模块缺乏了解,因此非常感谢任何帮助。我尝试在 moduleA 中添加 init.py 文件,但这并没有解决问题。

如果此信息相关,则路径 some_path/dir 位于我的 PYTHONPATH 上。

【问题讨论】:

    标签: python import module subdirectory


    【解决方案1】:

    这是由__package__ 变量引起的。
    要查看它的价值,请在导入前在 file1.py 中添加 print(__package__)

    直接运行file1.py时,可以看到__package__就是None
    但另一方面,当运行main.py时,当导入file1.py(并因此运行它)时,__package__的值(在file1.py中)突然变为moduleA,这就是python能够导入的原因moduleA.file2.

    【讨论】:

    • 需要对代码进行哪些更改才能从 Python 控制台导入 MyClass 而不会出错?
    • @antifragile 如果两个文件都在同一个目录中,为什么不只是from file2 import SOME_GLOBAL_VARIABLE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多