绝对导入如何与sitecustomize.py中不相关的导入一起使用?

Thebjorn

我有一个带有不幸的模块命名的软件包:

(dev) go|c:\srv\tmp\absimp> tree myapp
myapp
|-- __init__.py
|-- calendar.py
`-- tst.py

有内容

__init__.py:空。

myapp\calendar.py

from __future__ import print_function
print("imported:", __file__)

myapp\tst.py (第二行显示当前工作目录(cwd)以及python模块搜索路径上cwd下的所有目录:

from __future__ import print_function, absolute_import
import sys,os; cwd=os.getcwd(); print("CWD:", cwd, "PATH:", [p for p in sys.path if p.startswith(cwd)])

import calendar
print("CALENDAR from myapp/tst:", calendar.__file__)

myapp\tst.py想要导入Python的全局calendar模块,因此我已启用absolute_import而不是将其导入from . import calendar

站在myapp目录之外,我仍然可以找到本地目录calendar.py(Python 2.7.16和3.8.0-输出相同):

(dev) go|c:\srv\tmp\absimp> python myapp\tst.py
CWD: c:\srv\tmp\absimp PATH: ['c:\\srv\\tmp\\absimp\\myapp']
imported: c:\srv\tmp\absimp\myapp\calendar.py
CALENDAR from myapp/tst: c:\srv\tmp\absimp\myapp\calendar.py

从第一行输出中,我看到Python已将tst.py的目录添加sys.path

如果我编辑sitecustomize.py文件,请添加

import _strptime

并重新运行上面的命令,我现在得到了全局calendar...:

(dev) go|c:\srv\tmp\absimp> python myapp\tst.py
CWD: c:\srv\tmp\absimp PATH: ['c:\\srv\\tmp\\absimp\\myapp']
CALENDAR from myapp/tst: c:\python27\Lib\calendar.pyc

到底是怎么回事?

客人

之所以_strptime可行calendar,是因为即使您将主脚本的路径放在上,也可以自行PATH导入,因为您指定了导入sitecustomize.py(这些导入是预先完成的)。现在calendar已经在模块缓存中,因此不会再次导入,但是缓存中的那个将被重用:

>>> import sys
>>> 'calendar' in sys.modules
False
>>> import _strptime
>>> 'calendar' in sys.modules
True

实际上,存储在sys.modules其中的对象的类型无关紧要,它与模块名称作为键匹配。例如:

>>> import sys
>>> sys.modules['calendar'] = 'foo'
>>> import calendar
>>> print(calendar)
foo

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将罗盘内联图像助手与不相关的图像URL一起使用?

ESLint-仅允许绝对导入路径不相关

如何使用git合并到不相关的分支中?

Python名称空间和导入:在导入的模块中设置全局变量的值会创建另一个不相关的全局变量吗?

如何从子包中绝对导入?

如何使用bazel / webpack设置绝对导入?

cdk:导入不相关的不同堆栈的输出

如何在Symfony2中使用一堆不相关的实体创建表单?

无法使用symfony原则将不相关或不相关的表连接在一起

如何从父表中选择与子一中的外键不相关的数据

如何在Python 3中使用绝对导入来导入位于其父目录中的包?

如何在python 3.6中使用绝对导入和相对导入?

如何在Power BI中使用DAX在不相关表中搜索字符串?

如何解决使用绝对路径导入?

.py文件突然无法导入模块,但仍可与CMD一起使用

如何在SQL中检查多个不相关的条件?

如何在不相关的ViewModel中设置数据

如何查找不相关的未使用属性?

如何键入将在TypeScript中与命名导入一起导入的未知导出?

在Django中获取相关对象以及如何将Prefetch与相关模型一起使用

如何在库项目中具有绝对导入路径?

如何使Intellij(19.3)对python执行绝对自动导入?

绝对导入失败

绝对导入错误

如何限制哪些类可以更改另一个不相关的类中的字段的值

将两个不相关的查询结果合并到一个表中 - 如何?

当表彼此不相关时如何从另一个表中按顺序更新表列的值

在使用ParcelJS构建的Cypress测试中,如何在绝对路径中使用导入?

如何识别HTML树中语义相关但结构上不相关的节点