'import'操作的行为会有所不同。为什么会这样?

问题描述 投票:0回答:2

UPDATED:

情况1:

同一文件夹中的文件:

main.py

string.py

main.py中的代码:

import string

string.py中的代码:

print('Hello!')

正在运行main.py输出是:Hello!

案例2:

同一文件夹中的文件:

main.py

math.py

main.py中的代码:

import math

math.py中的代码:

print('Hello!')

正在运行main.py输出为空...

旧问题:

如果我将脚本命名为'string.py'并将其导入另一个脚本,则它将与内置的'string'模块重叠

如果我将脚本命名为'math.py'并将其导入另一个脚本,则内置的'math'与我自己的脚本重叠

具有内置模块之类名称的脚本导入行为取决于我如何命名它们。

受影响的某些模块名称:hashlib,字符串,日历

不影响的模块名称:数学,数学,操作系统

来自realpython.com

Python要做的第一件事是在sys.modules中查找名称abc。这是先前已导入的所有模块的缓存。如果在模块缓存中找不到该名称,Python将继续搜索内置模块列表。这些是模块预先安装了Python,可以在Python标准中找到图书馆。如果在内置模块中仍找不到该名称,则使用Python然后在sys.path定义的目录列表中搜索它。

摘自Michael Lutz的“学习Python”:

大致来说,Python的模块搜索路径由串联组成这些主要组件中的一部分,其中一些是为您预先设置的,另一些是您可以定制其中的哪些内容来告诉Python查找位置:

  1. 程序的主目录

  2. PYTHONPATH目录(如果已设置)

  3. 标准库目录

  4. 任何.pth文件的内容(如果存在)

  5. 第三方扩展的站点程序包主页

那么现在哪个是正确的?

python python-3.x import built-in
2个回答
0
投票

[数学和字符串之间的区别是,数学是用C语言编写的,以提高速度,而字符串模块是用Python编写的,可以在python lib目录下找到。

因此,当您尝试导入字符串时,本地文件将覆盖全局字符串文件,但是当您尝试导入数学时,Python不会搜索文件,因为它是内置在Python解释器中的。

您可以使用以下代码找到所有内置模块的列表:

import sys
print(sys.builtin_module_names)

如果您真的想覆盖数学模块,则可以通过更改sys.modules字典中的值来实现。


0
投票

我不相信@ZacharyaHaitin的回答是正确的,而且我非常确定,如果凯伦(Karen)确实看到问题中描述的行为,那么肯定还会有其他事情发生。

让我们看一些例子...

覆盖string模块

我们有一个空目录,其中包含两个文件:

$ ls
main.py string.py

文件main.py包含:

$ cat main.py
import string

文件string.py包含:

$ cat math.py
print('hello')

当我们运行main.py时,我们看到:

$ python main.py
hello

覆盖math模块

如果我们对math执行相同的实验,则会看到相同的行为。这是main.py

$ cat main.py
import math

这里是math.py

$ cat math.py
print('hello')

[当我们运行main.py时,我们看到的行为与前面示例中看到的行为相同:

$ python main.py
hello

以上示例在Python2和Python3中的行为相同。在任何情况下,都不需要用sys.modules来捣乱。

© www.soinside.com 2019 - 2024. All rights reserved.