python - 从模块导入函数在 Python 中如何工作?

标签 python python-3.x module python-import

我有一个模块 some_module.py,其中包含以下代码:

def testf():
    print(os.listdir())

现在,在名为 test.py 的文件中,我有以下代码:

import os
from some_module import testf

testf()

但是执行 test.py 会给我 NameError: name 'os' is not defined。我已经在test.py中导入了ostestftest.py的命名空间中。那么为什么会出现这个错误呢?

最佳答案

import与包含文件内容不同,就好像您直接键入它来代替 import陈述。如果您来自 C 背景,您可能会认为它以这种方式工作,其中 #include预处理器指令执行此操作,但 Python 不同。

import Python 中的语句读取正在导入的文件的内容并在其自己单独的上下文中对其进行评估 - 因此,在您的示例中,some_module.py 中的代码无法访问或了解 test.py 中存在的任何内容或任何其他文件。可以这么说,它是从一张“白纸”开始的。如果some_module.py的代码想要访问 os模块,你必须在 some_module.py 的顶部导入它.

当一个模块在 Python 中导入时,它变成了一个对象。也就是说,当你写

import some_module

Python 做的第一件事就是创建一个类型为 module 的新对象。代表正在导入的模块。当解释器遍历 some_module.py 中的代码时,它将在该文件中定义的任何变量、函数、类等分配为这个新模块对象的属性。所以在你的例子中,模块对象将有一个属性,testf .当函数中的代码testf想要访问变量 os ,它查看函数本身(本地范围)并看到 os没有在那里定义,所以它会查看模块对象的属性 testf属于(这是“全局”范围,虽然它不是真正的全局)。在您的示例中,它不会看到 os在那里,所以你得到一个错误。如果你添加

import os

some_module.py , 那么这将在名称 os 下创建模块的属性,您的代码将找到所需的内容。

您可能还对我写的其他一些答案感兴趣,这些答案可能有助于您理解 Python 的 import声明:

关于python - 从模块导入函数在 Python 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41480190/

相关文章:

python - 对字典列表中的字典键重新排序

linux - 使用mkfile编译linux内核模块

linux - 如何获取 linux 内核模块的选项列表?

python - Flask-WTF model_form、Sqlalchemy 和外键

python - 如何使用 Pandas 编写分区的 Parquet 文件

python - Django 默认表

python - 导入错误: cannot import name 'IncompleteRead' - Windows

python-3.x - Python 3 Tkinter Canvas

python - 在 Python 中导入的准确时间

python - 如何在 EC2 服务器上连续运行 Python 脚本?