python包导入原理解析
原文链接: https://www.cnblogs.com/hi3254014978/p/15317976.html
根据编程经验的不同,我们在运行程序时可能经常或者偶尔碰到下面这些问题,仔细观察后会发现这些问题无一例外都出现了一个相同的短语,很容易就可以发现,这个短语就是"relative import"。
ValueError: attempted relative import beyond top-level package
# 翻译:试图在顶级包之外进行相对导入
ImportError: attempted relative import with no known parent package
# 翻译:尝试相对导入,但没有已知的父包
ValueError: Attempted relative import in non-package
# 翻译:试图在非包中进行相对导入
SystemError: Parent module '' not loaded, cannot perform relative import
# 翻译:父模块'xxx'未加载,不能执行相对导入。
既然关于相对导入的报错提示,说明我们在代码中一定用到了相对导入的语法。下面先简单介绍一下相对导入的概念,随后详细介绍相对导入可能的问题和原理,最后给出上面提到的每个报错的解决方案。
绝对导入
既然要介绍相对导入,那必然绕不开绝对导入。绝对导入的格式为 import A.B 或 from A import B
下面是绝对导入的一些🌰:
import fibo # 隐式相对导入
from fibo import fibo1, fibo2 # 绝对路径导入
import fibo as fib # 重命名
from fibo import fib as fibonacci
相对导入
相对导入格式为 from .A import B 或 from ..X import Y, . 代表当前包, .. 代表上层包, ... 代表上上层包,依次类推。
相对导入的一些案例如下所示:
from . import echo # 表示从当前文件所在package导入echo这个module
from .. import formats # 表示从当前文件所在package的上层package导入formats这个子package或者moudle
from ..filters import equalizer # 表示从当前文件所在package的上层package导入的filters这个子package或者子module中导入equalizer
相对导入基于当前模块的名称。由于主模块的名称始终为"__main__"
,因此用作 Python 应用程序主模块的模块必须始终使用绝对导入。主模块所在文件夹不会被视作package,因此除了主模块外,与主模块处在同个文件夹的模块(也就是同级的模块)也必须使用绝对导入。
还有个更专业的说法: 相对导入使用模块的名称属性来决定模块在包层次结构中的位置,如果模块的名称不包含任何包信息(例如:模块名称为'main'),那么相对导入则被解析为最顶层的位置,不管这个时候这个模块实际上位于文件系统中的什么位置。
乍一看是不是觉得云里雾里,感觉每个字都认识,但就是不知道是什么意思,没关系,看完本文就理解了。加油💪🏻。
包package
文件夹被python解释器视作package需要满足两个条件:
1、文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。
2、不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)。顶层模块即是我们通常说的"main"方法所在的模块及其同级模块,其中"main"也常被称为主模块,即主模块所在文件夹不会被视作package。主模块的同级package被python解释器视为顶级包(也就是top-level package)。
如果想要导入顶层包更上层的包或者模块,需要将包路径添加到sys.path中
第一点很容易理解,下面详细介绍一下第二点。
脚本 & 模块?(script vs module)
python有两种加载文件的方法:一种是作为顶层的脚本,另一种是当做模块。如果你直接执行这个程序,那么这个文件就被当做是顶层脚本来执行了,在命令行里面输入 python myfile.py 就是这个情况。如果你输入python -m myfile.py或者在其他的文件当中使用import来导入这个文件的时候,它就被当做模块来导入。在同一时间里,只有一个主模块,主模块常被称为顶层脚本,顶层脚本可以这样解释:它是一个能够让你的程序从这里开始的python文件。
将模块作为脚本执行
test_script.py
# test_script.py
def fun1(): print("I'm fun1")
def fun2():
print(“I’m fun2”)
if name == “main”:
fun1()
fun2()
脚本中的__main__="name"下的代码仅在模块作为“主”文件执行时才运行:
$ python test_script.py
I'm fun1
I'm fun2
如果module是作为导入的模块,则不会执行该模块的__main__代码:
>>>import fibo
>>>
这通常用于为模块提供方便的用户界面,或用于测试目的(将模块作为脚本执行测试套件运行)。
模块的名称
当一个文件被加载进来,它就有一个名称(这个名称存储在__name__属性当中)。如果这个文件被当做一个主模块来执行,那么它的名字就是__main__。如果它被当做一个模块加载,那么它的名称就是文件名称,加上它所在的包名,以及所有的顶层的包名,这些名称中间是用点号隔开的。
比如下面的例子
package/
__init__.pysubpackage1/__init__.pymoduleX.pymoduleA.py
比如你导入moduleX(from package.subpackag1 import moduleX),它的名称就package.subpackage1.mouleX。如果你导入moduleA的时候(from package import moduleA),它的名称就是package.moudleA。
(注:这里是使用包导入,即把package以及里面的所有文件看做一个包,导入的时候使用from xxx import yyy的形式来进行,我们调用第三方包的时候就是这种情况),
但是,当你直接从命令行里面运行moduleX的时候,他的名称则被替换为__main__。如果你直接从命令行运行moduleA,它的名称也是__main__。当一个模块被当做一个顶层脚本来执行的时候,它原来的名称则会被__main__取代。
结论
当一个模块的名称中没有包,也就是只有文件名的时候,说明这个模块是一个顶层模块。顶层模块中不能使用相对导入。相对导入使用模块的名称属性来决定模块在包层次结构中的位置,相对导入能向上相对多少级,完全取决于模块名称中有多少层。
当你运行交互式的解释器的时候,交互式进程的名称永远是__main__,因此你不能在交互式进程当中使用相对导入。相对导入只能在模块文件当中使用。
参考: python相对包导入报“Attempted relative import in non-package”错误
解决方案:
1、ImportError: attempted relative import with no known parent package
导致这个问题的原因: 主模块或者同级模块用到了相对导入,且引用了主模块所在包。因为主模块所在包不会被python解释器视为package,在python解释器看来主模块所在的包就是一个未知的父包,所以如果不小心以相对导入的方式引用到了,就会报with no known parent package
这个错误。
案例一
主模块的同级模块在使用相对导入时引入了主模块所在包的案例
TestModule/├── __init__.py # 这个文件其实未起作用├── main.py # import brother1; print(__name__)├── brother1.py # from . import brother2; print(__name__)└── brother2.py # print(__name__)
运行main.py,运行结果如下
Traceback (most recent call last):File "/TestModule/main.py", line 1, in <module>import brother1File "/TestModule/brother1.py", line 1, in <module>from . import brother2
ImportError: attempted relative import with no known parent package
案例二
主模块在使用相对导入时引入了主模块所在包的案例
TestModule/├── __init__.py # 这个文件其实未起作用├── main.py # from . import brother1; print(__name__)├── brother1.py # import brother2; print(__name__)└── brother2.py # print(__name__)
运行main.py,运行结果如下
Traceback (most recent call last):File "/TestModule/main.py", line 1, in <module>from . import brother1
ImportError: attempted relative import with no known parent package
方案一:
解决方案也很简单,将相对导入给成绝对导入即可,上面这个案例只需要把from .
去掉即可。比如第一个案例
TestModule/├── __init__.py # 这个文件其实未起作用├── main.py # import brother1; print(__name__)├── brother1.py # import brother2; print(__name__)└── brother2.py # print(__name__)
运行main.py
brother2
brother1
__main__
方案二
案例2只能使用改为绝对导入这种方式,但是案例一还有一种解决方式是把main.py文件移动到TestModule文件夹外面,使之与TestModule文件夹平级,这样TestModule即会被解析器视为一个package,在其他模块中使用相对导入的方式引用到了也不会报错。
2、ValueError: attempted relative import beyond top-level package
导致这个问题的原因: 主模块所在同级包的子模块在使用相对导入时引用了主模块所在包。因为主模块所在包不会被python解释器视为package,主模块的同级package被视为顶级包(也就是top-level package),所以主模块所在包其实是在python解释器解析到的顶层包之外的,如果不小心以相对导入的方式引用到了,就会报beyond top-level package
这个错误。
一个案例:
TestModule/├── main.py # from Tom import tom; print(__name__)├── __init__.py├── Tom│ ├── __init__.py # print(__name__)│ ├── tom.py # from . import tom_brother; from ..Kate import kate; print(__name__)│ └── tom_brother.py # print(__name__) └── Kate ├── __init__.py # print(__name__)└── kate.py # print(__name__)
python main.py
Tom # 这个是Tom包的__init__.py的模块名,可以看出包里的__init__.py的模块名就是包名
Tom.tom_brother
Traceback (most recent call last):File "/TestModule/main.py", line 1, in <module>from Tom import tomFile "/TestModule/Tom/tom.py", line 2, in <module>from ..Kate import kate
ImportError: attempted relative import beyond top-level package
这个问题同样有两个解决方案
方案一:
把main.py移动到TestModule文件夹外面,使之与TestModule平级,这样TestModule即会被解析器视为一个package,在其他模块中使用相对导入的方式引用到了也不会报错。
src/
├── main.py # from TestModule.Tom import tom; print(__name__)
└── TestModule/├── __init__.py # print(__name__)├── Tom│ ├── __init__.py # print(__name__)│ ├── tom.py # from . import tom_brother; from ..Kate import kate; print(__name__)│ └── tom_brother.py # print(__name__) └── Kate ├── __init__.py # print(__name__)└── kate.py # print(__name__)
运行main.py
TestModule
TestModule.Tom
TestModule.Tom.tom_brother
TestModule.Kate
TestModule.Kate.kate
TestModule.Tom.tom
__main__
方案二:
tom.py中将TestModule包加入到sys.path变量中,并使用绝对导入的方式导入Kate包,修改后的tom.py内容如下:
from . import tom_brother
import os, sys
sys.path.append("..") # 等价于 sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from Kate import kate # 改成绝对导入的方式导入Kate
print(__name__)
运行结果如下
Tom
Tom.tom_brother
Kate
Kate.kate
Tom.tom
__main__
关于为什么已经把TestModule加入了包查找路径还需要使用绝对导入来导入Kate的的解释:
从上面的运行结果可以看出,tom_brother.py的模块名还是Tom.tom_brother,模块名并没有因为把TestModule加入了包查找路径就发生改变,而相对导入是根据模块名来确定的,如果模块名中没有TestModule,那还是不能使用相对导入的方式来导入Kate,所以必须使用绝对导入的方式来导入Kate包
3、ValueError: Attempted relative import in non-package
4、SystemError: Parent module ' ' not loaded, cannot perform relative import
3和4这两个报错的原因是一样的,都是把使用了相对导入的module当做主模块而直接运行了,即直接运行的脚本中包含了相对导入。但是我按这种方式操作了一下,发现无论怎么操作,报错提示始终是上面的第一个报错,即ImportError: attempted relative import with no known parent package
。
后来发现是python 版本的问题,
python2在直接运行的脚本中使用相对导入时会报ValueError: Attempted relative import in non-package
这个错误,
python3.x(没测3.x具体是哪个版本)到python3.5报错SystemError: Parent module '' not loaded, cannot perform relative import
;
python3.6及以上的报错提示是ImportError: attempted relative import with no known parent package
。
解决方案是:
去除主模块(脚本)中的相对导入,改为绝对导入。
这个问题的复现花我了好大一番功夫,找了好多博客,都说是主模块中用到了相对导入,但是我这么做就是不报这个错,而是报第一个错
ImportError: attempted relative import with no known parent package
,最后还是在一些博客中找到了蛛丝马迹,并且用docker快速拉取对应区间python版本镜像验证,得出结论,平时多学点东西还是很有用处的,比如docker,看似平时用不上,关键时刻还是真帮了大忙,否则重新在电脑上安装一个python版本,估计又得费老大功夫了。
相对导入对于包的优势
既然会引发这么多问题,那是不是我们以后就完全不用相对导入了呢。当然不!
相对导入相较于绝对导入还是有一些优势的
- 书写相较于绝对导入简单
- 相对导入可以避免硬编码带来的包维护问题,例如我们改了某一层包的名称,那么其它模块对于其子包的所有绝对导入就不能用了,但是采用相对导入语句的模块,就会避免这个问题。
参考: Python 包内的导入问题(绝对导入和相对导入)
顺便一提
包查找路径是sys.path
变量中。sys.path
初始状态一般由三部分组成:python正在执行的脚本的目录,PYTHONPATH路径,包的默认安装路径。
自从python2.6,模块的名称不在决定使用__name__属性,而是使用__packege__属性。这就是为什么我避免使用__name__这么明确的名称来代表一个模块的名称。自从python2.6,一个模块的名称是由__package__+'.'+__name__来确定的,如果__packege__是None的话,那么这个名称就是__name__了
参考:
6.模块
Python包的相对导入时出现错误的解决方法、
python相对包导入报“Attempted relative import in non-package”错误
Python 包内的导入问题(绝对导入和相对导入)
源文:
相关文章:
python包导入原理解析
原文链接: https://www.cnblogs.com/hi3254014978/p/15317976.html 根据编程经验的不同,我们在运行程序时可能经常或者偶尔碰到下面这些问题,仔细观察后会发现这些问题无一例外都出现了一个相同的短语,很容易就可以发现࿰…...
MNIST手写数字辨识-cnn网路 (机器学习中的hello world,加油)
用PyTorch实现MNIST手写数字识别(非常详细) - 知乎 (zhihu.com) 参考来源(这篇文章非常适合入门来看,每个细节都讲解得很到位) 一、模块函数用法-查漏补缺: 1.关于torch.nn.functional.max_pool2d()的用法: 上述示例…...
论文笔记《3D Gaussian Splatting for Real-Time Radiance Field Rendering》
项目地址 原论文 Abstract 最近辐射场方法彻底改变了多图/视频场景捕获的新视角合成。然而取得高视觉质量仍需神经网络花费大量时间训练和渲染,同时最近较快的方法都无可避免地以质量为代价。对于无边界的完整场景(而不是孤立的对象)和 10…...
数据库管理系统,数据库,sql的基本介绍以及它们之间的关系
数据库管理系统(Database Management System,简称DBMS)是一种软件工具或系统,用于管理和维护数据库的创建、访问、更新和管理。DBMS允许用户在数据库中存储、检索和操作数据,同时提供了数据安全性、完整性和一致性的控…...
【Flowable】Springboot使用Flowable(一)
一、项目依赖 <dependency><groupId>org.flowable</groupId><artifactId>flowable-engine</artifactId><version>6.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>my…...
戳泡泡小游戏
欢迎来到程序小院 戳泡泡 玩法: 鼠标点击上升的起泡泡,点击暴躁记录分数,不要让泡泡越过屏幕,共有三次复活生命,会有随机星星出现,点击即可暴躁全屏哦^^。开始游戏https://www.ormcc.com/play/gameStart/1…...
Redis缓存
1. Redis缓存相关问题 1.1 缓存穿透 缓存穿透是指查询一个数据库一定不存在的数据。 我们以前正常的使用Redis缓存的流程大致是: 1、数据查询首先进行缓存查询 2、如果数据存在则直接返回缓存数据 3、如果数据不存在,就对数据库进行查询࿰…...
mysql 插入更新数据
insert into insert into 语句进行插入时,如果插入的字段包含 主键或者唯一索引字段,那么, 1)主键或唯一索引 已存在,则插入失败 1062 - Duplicate entry 1 for key PRIMARY 2)只有主键或者唯一索 引不存…...
系统架构设计高级技能 · 软件产品线
现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 软件产品线 一、产品线概述二、产品线的过程模型2.1 双生命…...
C语言学习系列-->字符函数和字符串函数
文章目录 一、字符函数1、字符分类函数2、字符转换函数 二、字符串函数1、strlen概述模拟实现 2、strcpy概述模拟实现 3、strcat概述模拟实现 3、strcmp概述模拟实现 4、有限制的字符串函数strncpystrncatstrncmp 4、strstr概述模拟实现 一、字符函数 1、字符分类函数 包含头…...
尖端AR技术如何在美国革新外科手术实践?
AR智能眼镜已成为一种革新性的工具,在外科领域具有无穷的优势和无限的机遇。Vuzix与众多医疗创新企业建立了长期合作关系,如Pixee Medical、Medacta、Ohana One、Rods & Cones、Proximie等。这些公司一致认为Vuzix智能眼镜可有效提升手术实践&#x…...
【木板】Python实现-附ChatGPT解析
1.题目 木板 时间限制:1s 空间限制:256MB 限定语言:不限题目描述: 小明有n块木板,第i (1<=i<=n) 块木板的长度为ai.小明买了一块长度为m的木料,这块木料可以切割成任意块,拼接到已有的木板上用来加长木板。 小明想让最短的木板尽量长。 请问小明加长木板后,最短木板…...
第一章:绪论
1.1 系统架构概述 架构是体现在组件中的一个系统的基本组织、它们彼此的关系与环境的关系以及指导它的设计和发展的原则。 系统是组织起来完成某一特定功能火一组功能的组件集。系统这个术语包括了单独的应用程序、传统意义上的系统、子系统、系统之系统、产品线、整个企业及…...
C++面试知识点总结
知识点总结 <<符号表示该语句将把这个字符串发送给cout;该符号指出了信息流动的路径;cout的对象属性包括一个插入运算符(<<),它可以将其右侧的信息插入到流中,endl:重起一行。在输出流中插入en…...
从智能手机到智能机器人:小米品牌的高端化之路
原创 | 文 BFT机器人 前言 在前阵子落幕的2023世界机器人大会“合作之夜”上,北京经济技术开发区管委会完成了与世界机器人合作组织、小米机器人等16个重点项目签约,推动机器人创新链和产业链融合,其中小米的投资额达到20亿! 据了…...
深度学习推荐系统(八)AFM模型及其在Criteo数据集上的应用
深度学习推荐系统(八)AFM模型及其在Criteo数据集上的应用 1 AFM模型原理及其实现 沿着特征工程自动化的思路,深度学习模型从 PNN ⼀路⾛来,经过了Wide&Deep、Deep&Cross、FNN、DeepFM、NFM等模型,进⾏了大量的、基于不…...
【Spring】aop的底层原理
🎄欢迎来到边境矢梦的csdn博文🎄 🎄本文主要梳理 Spring 中的切面编程aop的底层原理和重点注意的地方 🎄 🌈我是边境矢梦,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以…...
微信小程序开发---基本组件的使用
目录 一、scroll-view (1)作用 (2)用法 二、swiper和swiper-item (1)作用 (2)用法 三、text (1)作用 (2)使用 四、rich-tex…...
SpringBoot国际化配置组件支持本地配置和数据库配置
文章目录 0. 前言i18n-spring-boot-starter1. 使用方式0.引入依赖1.配置项2.初始化国际化配置表3.如何使用 2. 核心源码实现一个拦截器I18nInterceptorI18nMessageResource 加载国际化配置 3.源码地址 0. 前言 写个了原生的SpringBoot国际化配置组件支持本地配置和数据库配置 背…...
Shell编程之sort
sort 命令将文件的每一行作为比较对象,通过将不同行进行相互比较,从而得到最终结果。从首字符开始,依次按ASCII码值进行比较,最后将结果按升序输出。 基本语法 sort (选项)(参数) 常用选项 常用选项 -n根据字符串的数字比较-r…...
windows docker 容器启动报错:Ports are not available
docker 启动容器报错: (HTTP code 500) server error - Ports are not available: listen tcp 0.0.0.0:6379: bind: An attempt was made to access a socket in a way forbidden by its access permissions. 问题排查 检查端口是否被其它程序占用:nets…...
300. 最长递增子序列
题目描述 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示…...
DNS(域名解析系统)
含义 当我们在上网要访问莫个服务器的时候,就需要知道服务器的IP地址,但IP地址是一串数字,虽然这串数字用点分十进制已经清晰不少了,但还是不利于人们记忆和传播,于是人们使用单词来代替IP地址(例如baidu&a…...
解决jsp/html界面跳转servlet出现404错误的方法
解决jsp/html界面跳转servlet出现404错误的方法 最近在学习黑马项目过程中遇到的问题 问题一: 检查页面的跳转路径和名称拼写是否正确 问题二: tomcat发布项目时所使用的路径名称与项目不同 在idea右上角点击如图圈住的按钮 在deployment中更改出现…...
catface,使用Interface定义Controller,实现基于Http协议的RPC调用
catface 前言cat-client 模块EnableCatClientCatClientCatMethodCatNoteCatResponesWrapperCatClientConfigurationCatClientProviderCatClientFactoryCatSendInterceptorCatHttpCatPayloadResolverCatObjectResolverCatLoggerProcessorCatResultProcessorCatSendProcessorAbst…...
Linux:LVS (NAT群集搭建)
模拟环境 外网入口服务器 外网 192.168.8.88 内网ip 192.168.254.4 web1 服务器 ip 192.168.254.1 网关: 192.168.254.4 web2 服务器 ip 192.168.254.2 网关: 192.168.254.4 共享存储服务器 ip 192.168.254.3 介绍 访问 外网192.16…...
音乐格式转换mp3怎么转?跟着步骤操作一遍
音乐格式转换mp3怎么转?mp3,一种音频数据压缩格式,由于其极具优势的文件尺寸小和高质量音效,自诞生之日起就占据了主流音乐格式的头把交椅,并且至今仍然受到用户的青睐,稳居音乐领域的霸主地位。在我们繁忙…...
it监控系统可以电脑吗?有什么效果
IT业务监控已经成为公司不可或缺的一部分,以确保业务的正常运行,提高企业的竞争能力。本文将详细介绍IT业务监控的必要性、实施方法以及如何选择合适的监控工具。 IT业务监控的必要性 确保业务稳定运行 IT业务监控可以实时检测公司的工作流程&#x…...
jvs-智能bi(自助式数据分析)9.1更新内容
jvs-智能bi更新功能 1.报表增加权限功能(服务、模板、数据集、数据源可进行后台权限分配) 每个报表可以独立设置权限,通过自定义分配,给不同的人员分配不同的权限。 2.报表新增执行模式 可选择首次报表加载数据为最新数据和历…...
MyBatis-Plus-扩展操作(3)
3.扩展 代码生成 逻辑删除 枚举处理器 json处理器 配置加密 分页插件 3.1 代码生成 https://blog.csdn.net/weixin_41957626/article/details/132651552 下载下面的插件 红色的是刚刚生成的。 我觉得不如官方的那个好用,唯一的好处就是勾选的选项能够看的懂得。…...
中国空间站/电商seo是什么意思
macOS的最新版本Big Sur具有许多新功能和改进,我们大多数人都希望尽快安装它。在大多数情况下,一切都会正常进行,因此我们可以快速启动并运行。但是,有时它运行不正常,并且您会看到一条消息,指出无法完成ma…...
企业网站seo策略/baidu com百度一下
一般我们用短草丛被角色经过或平常的飘动效果都是用3d实现的,3d实现起来就比较简单,就是对模型上的顶点做与角色距离的相反方向偏移就好了,平常的飘动效果一般是用sin做弧度变化或者甚至就直接uv的来回移动就好。 我们是3渲2的画面俯四十五度…...
怎样制作微信网站链接/推广普通话的宣传内容
本文来总结一下mybatis中的多对多映射,从第8节的文章中可以看出,用户表和商品表示多对多关系,它们两的多对多是通过订单项和订单明细这两张表所关联起来的,那么这一节主要来总结一下用户表和商品表之间的多对多映射。 首先在上一…...
外国网站dns/广告营销
技术名称官网jQuery函式库http://jquery.com/Bootstrap前端框架http://getbootstrap.com/Bootstrap-tableBootstrap数据表格http://bootstrap-table.wenzhixin.net.cn/Font-awesome字体图标http://fontawesome.io/material-design-iconic-font字体图标https://github.com/zavol…...
怎样做网站平台赚钱/网站seo优化外包顾问
使用Typora将其中的图片自动上传云床,并替换链接 文章目录准备工作以Gitee为例使用感受准备工作 下载Typora 下载**typora-plugins-win-img** 安装好Typora [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nwaanekr-1582617480654)(ht…...
一个完整网站开发/汕头seo推广外包
每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试…...