python - Python 模块导入的层次结构是什么?
问题描述
假设我在一个目录中有 Python 模块,并且在同一个目录中我有一个 Python 脚本,它以某种方式使用这个模块。
wdir
├── module
│ └── module_stuff
└── script.py
如果我在未安装模块的 python 环境中执行此文件,则一切正常,因为 Python 从其源代码导入模块。
问题是:如果我在这个 Python 环境中安装模块并继续以与以前相同的方式执行脚本,Python 会从已安装的模块中导入模块还是从源代码中导入模块?Python 搜索每个导入遵循的层次结构是什么?
为什么重要:如果我有一个脚本在这个执行过程中反复调用其他Python脚本并修改了模块的源代码,那么就会出现使用旧版本的模块和新版本的结果,甚至更糟,如果在模块代码中插入错误,则可能会错过执行。但是,如果创建一个与测试环境分开的开发环境,这将得到解决。
解决方案
似乎取决于sys.path
引用https://docs.python.org/3/tutorial/modules.html#the-module-search-path:
当导入名为 spam 的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它会在变量 sys.path 给出的目录列表中搜索名为 spam.py 的文件。sys.path 从这些位置初始化:[编辑:大概按此顺序]
包含输入脚本的目录(或未指定文件时的当前目录)。
PYTHONPATH(目录名称列表,与 shell 变量 PATH 具有相同的语法)。
安装相关的默认值。
接着说
初始化后,Python 程序可以修改 sys.path。
这向我表明理论上任何事情都可能发生:-/
我猜module_stuff
它与内置函数的名称不同,因此排除了其中的第一个。
您可能知道,Python 不会在一次运行中两次导入同一个模块。也许您可以通过对它进行一些小的更改module/module_stuff
并再次运行来测试它。
推荐阅读
- wordpress - 是否可以将分类术语用作类别?
- amazon-cloudformation - 如何在 AWS 无服务器函数中设置 Oauth 范围?
- python - AWS Sagemaker 多项训练作业
- filepond - 在 ondata 事件中获取文件路径
- python - Visual Studio Code Python 中的 Pylint 错误
- linux - 如何根据 linux 中的条件(使用 awk 或任何其他)从另一个 csv 文件替换一个 csv 文件的行?
- php - 将数据从三个表单发送到控制器
- encryption - 从未加密的 Redshift 集群迁移到加密的集群
- ruby - 无法使用 DynamoDB GSI
- vb.net - Vb.net 使用 OdbcConnection 登录