搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
我家自动化
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
HarmonyOS shape 的使用_ohos设置shape中的size
2
Android Maven仓库搭建 - 实现自动化打包自动拉取最新maven依赖
3
【Rust日报】2022-09-14 使用 Rust 构建简单博客 && 华为实习生招募
4
win7远程桌面连接不上,解决办法_win7远程桌面连接不上 ip
5
flash-attn安装报错ERROR: Could not build wheels for flash-attn, which is required to install pyproject
6
docker容器映射宿主机端口后无法访问的问题_docker端口映射成功 不可用
7
java mock私有方法_尝试使用mockito和powermock模拟私有方法时获取java.lang.NullPointerException...
8
Docker学习(5)—— 在Docker上安装软件_在运行的docker里安装软件
9
linux篇-文件传输_scp 保留权限
10
如何在centos上安装nvidia驱动_centos安装nvidia驱动
当前位置:
article
> 正文
python模块导入机制_rockycapture上传任务失败怎么回事儿
作者:我家自动化 | 2024-03-20 08:59:36
赞
踩
rockycapture上传任务失败怎么回事儿
模块的搜索路径
模块的搜索路径都放在了sys.path列表中,如果缺省的sys.path中没有含有自己的模块或包的路径,可以动态的加入(sys.path.apend)即可。下面是sys.path在Windows平台下的添加规则。
1、sys.path第一个路径往往是主模块所在的目录。在交互环境下添加一个空项,它对应当前目录。
2、如果PYTHONPATH环境变量存在,sys.path会加载此变量指定的目录。
3、我们尝试找到Python Home,如果设置了PYTHONHOME环境变量,我们认为这就是Python Home,否则,我们使用python.exe所在目录找到lib\os.py去推断Python Home。
如果我们确实找到了Python Home,则相关的子目录(Lib、plat-win、lib-tk等)将以Python Home为基础加入到sys.path,并导入(执行)lib/site.py,将site-specific目录及其下的包加入。
如果我们没有找到Python Home,则把注册表Software\Python\PythonCore\2.5\PythonPath的项加入sys.path(HKLM和 HKCU合并后加入),但相关的子目录不会自动添加的。
4、如果我们没有找到Python Home,并且没有PYTHONPATH环境变量,并且不能在注册表中找到PythonPath,那么缺省相对路径将加入(如:.\Lib;.\plat-win等)。
总结如下
当在安装好的主目录中运行Python.exe时,首先推断Python Home,如果找到了PythonHome,注册表中的PythonPath将被忽略;否则将注册表的PythonPath加入。
如果PYTHONPATH环境变量存在,sys.path肯定会加载此变量指定的目录。
如果Python.exe在另外的一个目录下(不同的目录,比如通过COM嵌入到其他程序),Python Home将不推断,此时注册表的PythonPath将被使用。
如果Python.exe不能发现他的主目录(PythonHome),并且注册表也没有PythonPath,则将加入缺省的相对目录。
标准Import
Python中所有加载到内存的模块都放在sys.modules。当import一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加 载了则只是将模块的名字加入到正在调用import的模块的Local名字空间中。如果没有加载则从sys.path目录中按照模块名称查找模块文件,模 块文件可以是py、pyc、pyd,找到后将模块载入内存,并加入到sys.modules中,并将名称导入到当前的Local名字空间。
可以看出了,一个模块不会重复载入 。多个不同的模块都可以用import引入同一个模块到自己的Local名字空间,其实背后的PyModuleObject对象只有一个。
说一个容易忽略的问题,import只能导入模块,不能导入模块中的对象(类、函数、变量等)。 如一个模块A(A.py)中有个函数getName,另一个模块不能通过import A.getName将getName导入到本模块,只能用import A。如果想只导入特定的类、函数、变量则用from A import getName即可。
嵌套Import
嵌套import,我分两种情况,一种是:本模块导入A模块(import A),而A中又有import语句,会激活另一个import动作,如import B,而B模块又可以import其他模块,一直下去。
对这种嵌套比较容易理解,注意一点就是各个模块的Local名字空间是独立的,所以上面的例子,本模块import A完了后本模块只能访问模块A,不能访问B及其他模块。虽然模块B已经加载到内存了,如果要访问还要在明确的在本模块中import B。
另外一种嵌套指,在模块A中import B,而在模块B中import A。这时会怎么样呢?这个在Python列表中由RobertChen给出了详细解释,抄录如下:
1
2
3
4
5
6
7
[A.py]
from B import D
class C:pass
[B.py]
from A import C
class D:pass
为什么执行A的时候不能加载D呢?
如果将A.py改为:import B就可以了。
这是怎么回事呢?
RobertChen:这跟Python内部import的机制是有关的,具体到from B import D,Python内部会分成几个步骤:
在sys.modules中查找符号”B”
果符号B存在,则获得符号B对应的module对象<module B>。 从<module B>的__dict__中获得符号”D”对应的对象,如果”D”不存在,则抛出异常
如果符号B不存在,则创建一个新的module对象<module B>,注意,这时,module对象的__dict__为空。执行B.py中的表达式,填充<module B>的__dict__ 。 从<module B>的__dict__中获得”D”对应的对象,如果”D”不存在,则抛出异常。
所以,这个例子的执行顺序如下:
1、执行A.py中的from B import D
由于是执行的python A.py,所以在sys.modules中并没有<module B>存在,首先为B.py创建一个module对象(<module B>),注意,这时创建的这个module对象是空的,里边啥也没有,在Python内部创建了这个module对象之后,就会解析执行B.py, 其目的是填充<module B>这个dict。
2、执行B.py中的from A import C
在执行B.py的过程中,会碰到这一句,首先检查sys.modules这个module缓存中是否已经存在<module A>了,由于这时缓存还没有缓存<module A>,所以类似的,Python内部会为A.py创建一个module对象(<module A>),然后,同样地,执行A.py中的语句。
3、再次执行A.py中的from B import D
这时,由于在第1步时,创建的<module B>对象已经缓存在了sys.modules中,所以直接就得到了<module B>,但是,注意,从整个过程来看,我们知道,这时<module B>还是一个空的对象,里面啥也没有,所以从这个module中获得符号”D”的操作就会抛出异常。如果这里只是import B,由于”B”这个符号在sys.modules中已经存在,所以是不会抛出异常的。
上面的解释已经由Zoom.Quiet收录在啄木鸟 了,里面有图,可以参考一下。
Package(包) Import
包(Package)可以看成模块的集合,只要一个文件夹下面有个__init__.py文件,那么这个文件夹就可以看做是一个包。包下面的文件夹 还可以成为包(子包)。更进一步,多个较小的包可以聚合成一个较大的包,通过包这种结构,方便了类的管理和维护,也方便了用户的使用。比如 SQLAlchemy等都是以包的形式发布给用户的。
包和模块其实是很类似的东西,如果查看包的类型import SQLAlchemy type(SQLAlchemy),可以看到其实也是<type ‘module’>。import包的时候查找的路径也是sys.path。
包导入的过程和模块的基本一致,只是导入包的时候会执行此包目录下的__init__.py 而不是模块里面的语句了。另外,如果只是单纯的导入包,而包的__init__.py中又没有明确的其他初始化操作,那么此包下面的模块是不会自动导入的。如:
PA
–__init__.py
–wave.py
–PB1
–__init__.py
–pb1_m.py
–PB2
–__init__.py
–pb2_m.py
__init__.py都为空,如果有以下程序:
1
2
3
4
5
6
7
8
9
10
11
12
import sys
import PA.wave #1
import PA.PB1 #2
import PA.PB1.pb1_m as m1 #3
import PA.PB2.pb2_m #4
PA.wave.getName() #5
m1.getName() #6
PA.PB2.pb2_m.getName() #7
当执行#1后,sys.modules会同时存在PA、PA.wave两个模块,此时可以调用PA.wave的任何类或函数了。但不能调用PA.PB1(2)下的任何模块。当前Local中有了PA名字。
当执行#2后,只是将PA.PB1载入内存,sys.modules中会有PA、PA.wave、PA.PB1三个模块,但是PA.PB1下的任何 模块都没有自动载入内存,此时如果直接执行PA.PB1.pb1_m.getName()则会出错,因为PA.PB1中并没有pb1_m。当前Local 中还是只有PA名字,并没有PA.PB1名字。
当执行#3后,会将PA.PB1下的pb1_m载入内存,sys.modules中会有PA、PA.wave、PA.PB1、 PA.PB1.pb1_m四个模块,此时可以执行PA.PB1.pb1_m.getName()了。由于使用了as,当前Local中除了PA名字,另外 添加了m1作为PA.PB1.pb1_m的别名。
当执行#4后,会将PA.PB2、PA.PB2.pb2_m载入内存,sys.modules中会有PA、PA.wave、PA.PB1、PA.PB1.pb1_m、PA.PB2、PA.PB2.pb2_m六个模块。当前Local中还是只有PA、m1。
下面的#5,#6,#7都是可以正确运行的。
注意的是:如果PA.PB2.pb2_m想导入PA.PB1.pb1_m、PA.wave是可以直接成功的。最好是采用明确的导入路径,对于./..相对导入路径还是不推荐用。
http://blog.csdn.net/kernelspirit/archive/2008/11/26/3381666.aspx
本文来源于 冰山上的播客
http://xinsync.xju.edu.cn
, 原文地址:
http://xinsync.xju.edu.cn/index.php/archives/4792
from:
http://xinsync.xju.edu.cn/index.php/archives/4792
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/我家自动化/article/detail/272174
推荐阅读
article
计算
整数
n
的
因子
之和(pytho
n
)_编写函数fu
n
整数
n
的
所有
因子
之和...
该楼层疑似违规已被系统折叠隐藏此楼查看此楼/*-------------------------------------...
赞
踩
article
[
Leetcode
][
python
]
Substring
with
Concatenation
of ...
题目大意现有一组长度相等的字符串words,要在原字符串中找出正好包含words中所有字符串的子字符串的起始位置。 例子...
赞
踩
article
python
leetcode
30
.
Substring
with
Concatenation o...
这里判断是子字符串所以不用最小滑动窗而用DFS也能通过,每次都是从头判断。有几个剪枝点:1.满足子字符串定长2.字典中每...
赞
踩
article
【
计算机
视觉】
OpenCV
4
高级编程与项目实战(
Python
版)【2】:操作
像素
_
opencv
4
...
像素
是构成图像的基本单位。现在看图1所示的花卉图像,这幅图看着很细腻,不过将图像的白框区域放大,会看到如图2所示的效果,...
赞
踩
article
常用的
Python
工具
:
使用
virtualenv
、
使用
Pip
进行
安装
和
管理
包...
在
使用
Python
进行
应用程序开发时,经常会听到一些
工具
在各个地方或开源代码中被频繁提及。尽管这些
工具
被广泛
使用
,但...
赞
踩
article
Python
学习笔记.OS学习笔记 OS
操作系统
(
operating
system
)(一)_wind...
前言,日常操作。列出文件夹或者目录内容,创建和删除文件,以及一些其他无聊的事都可以交给
Python
这个小玩意实现!进入正...
赞
踩
article
windows
安装
python
的
mysql
驱动
mysql
-
connector
-
python
_mysq...
下载对应的版本安装包http://dev.
mysql
.com/downloads/
connector
/
python
/直接...
赞
踩
article
mysql
-
connector
-
python
使用_
mysql
-
connector
/
python
使用...
1.下载安装
connector
/
python
下载的版本(
mysql
-
connector
-
python
-8.0.15-py...
赞
踩
article
python
中文
开发文档_
platform
(
Operating
System
) –
Python
...
Python
中文
开发手册
platform
(
Operating
System
) -
Python
中文
开发手册2.3版...
赞
踩
article
Python
MySQL
-
mysql
-
connector
驱动_
mysql
-
connector
-...
需要注意的是,这只是一个简单的示例,实际的主从复制配置可能会更复杂,包括指定主服务器的IP地址、端口号、日志文件的位置等...
赞
踩
article
MySQL
安装中出现的The
selected
path
already
exists
以及Conne...
对
MySQL
安装中出现的The
selected
path
already
exists
以及Connector/Pyth...
赞
踩
article
python
英文
-
Python
中常用
英文
单词
大全...
application 应用程式 应用、应用程序application framework 应用程式框架、应用框架 应用...
赞
踩
article
版本查询
常用命令
_
hypium
python
...
常用命令
which
python
(查询
python
安装地址)
python
-V 或
python
--version ...
赞
踩
article
python
table
属性
_
SQLAlchemy
“
Table
”对象没有
属性
“
datetime
”...
我在下面的代码中得到以下错误。我看不到表/对象返回的位置,或者至少应该返回。任何其他的建议也将是受欢迎的。在我跑OrmC...
赞
踩
article
python
table
对象_
Python
与数据库
sqlalchemy
建立
声明层表对象的两...
在对表对象进行
建立
的时候,通常有
两种
方式
可以完成,以下是
两种
方式
的
建立
过程对比首先导入需要的模块,获取一个声明层1 fr...
赞
踩
article
【深度学习目标
检测
】六、基于深度学习
的
路标识别(
python
,
目标
检测
,
yolov8
)_
yolov8
...
本文介绍了基于Yolov8
的
路标
检测
模型
,
包括训练过程和数据准备过程
,
同时提供了推理
的
代码。对准备计算机视觉相关
的
毕业设...
赞
踩
article
毕设 深度学习
opencv
python
实现
中国
交通标志
识别
_
python
opencv
交通标志
...
毕设 深度学习
opencv
python
实现
中国
交通标志
识别
_
python
opencv
交通标志
识别
python
o...
赞
踩
article
毕业设计
-基于
深度
学习
的道路
交通标志
目标
检测
算法系统 YOLO python 卷积神经网络
人工智能
...
毕业设计
-基于
深度
学习
的道路
交通标志
目标
检测
算法系统的
毕业设计
。该系统旨在利用
深度
学习
技术,自动化地
检测
和识别
道路交通
标...
赞
踩
article
交通信号
标志
识别
软件
(
Python
+
YOLOv5
深度学习模型+清新界面)_基于
图像处理
的
交通信号
数字...
交通信号
标志
识别
软件
用于
交通信号
标志
的检测和
识别
,利用机器视觉和深度学习智能
识别
交通
标志
并可视化记录,以辅助无人驾驶等。...
赞
踩
article
【
Python
】
进阶
学习
:
pandas
--
query
()用法详解...
query
...
赞
踩
相关标签
计算整数n的因子之和(python)
python
leetcode
计算机视觉
opencv
Python学习笔记.OS学习笔记 OS操作系统(operating
mysql-connector-python 使用
python中文开发文档
mysql
adb
数据库
命令
python table属性
python table对象
深度学习
目标检测
毕业设计
交通标志识别