>  기사  >  백엔드 개발  >  Python 모듈 가져오기 메커니즘과 대규모 프로젝트의 사양을 알아보세요.

Python 모듈 가져오기 메커니즘과 대규모 프로젝트의 사양을 알아보세요.

coldplay.xixi
coldplay.xixi앞으로
2020-09-27 17:38:162806검색

Python Video Tutorial 칼럼에서는 오늘 Python 모듈 가져오기 메커니즘과 대규모 프로젝트의 사양을 배울 수 있는 방법을 소개합니다.

Python 모듈 가져오기 메커니즘과 대규모 프로젝트의 사양을 알아보세요.

머리말

우리는 일상적인 프로젝트에서 Python을 사용하는 과정에서 각 모듈의 가져오기 문제를 해결해야 하는 경우가 많고 참조 경로 찾기, 모듈 교차 가져오기 등과 같은 문제에 자주 직면합니다. , 그래서 이 글을 썼습니다. 이 글은 Python의 모듈 가져오기 메커니즘과 일상적인 대규모 프로젝트에서 따라야 할 모듈 가져오기 사양을 설명하는 것을 목표로 합니다

Python 모듈 가져오기

일상 프로그래밍에서 작성된 코드 로직을 재사용하기 위해 우리는 코드를 모듈로 캡슐화하여 개발 효율성을 향상시키기 위해 필요할 때 직접 가져오고 재사용할 수 있습니다. 모듈은 함수, 클래스, 변수를 정의할 수 있으며 실행 가능한 코드를 포함할 수도 있습니다. 모듈 소스에는 세 가지 유형이 있습니다. ①Python 내장 모듈(표준 라이브러리); ②타사 모듈; ③사용자 정의 모듈;

가져오기 원칙

모듈 가져오기는 일반적으로 파일 헤더의 import 키워드를 사용하여 수행됩니다. 모듈 가져오기는 가져온 모듈을 한 번 실행한 다음 다음을 사용하여 이 네임스페이스에 모듈을 생성하는 것과 같습니다. 가져온 모듈 모듈 네임스페이스의 연결은 이 네임스페이스에 새 변수를 생성하는 것과 동일합니다. 이 변수의 이름은 가져온 모듈의 이름이며 가져온 모듈의 네임스페이스를 가리킵니다. 따라서 가져온 모듈은 변수와 동일합니다. 따라서 동일한 모듈을 여러 번 가져오는 것은 처음 가져올 때만 실행됩니다. (이후 가져오기에서는 이 모듈 변수가 이미 존재하는 것으로 확인되어 실행되지 않습니다.)

Python 모듈 가져오기 메커니즘과 대규모 프로젝트의 사양을 알아보세요.

경로 검색 메커니즘

가져온 모든 모듈은 Python의 내장 사전 sys.modules에 저장됩니다. Python이 시작되자마자 메모리에 로드됩니다. 새 모듈을 가져오면 sys.modules가 자동으로 로드됩니다. 모듈을 기록합니다. Python의 모듈 검색 경로 메커니즘은 다음과 같습니다.

  1. 모듈이 sys.path의 모든 경로에 있는지 확인하고, 그렇다면 모듈을 로드할 새 공간을 엽니다.
  2. 내장 패키지가 있는지 확인합니다. 또는 sys.modules에 설치되었습니다. 설치된 타사 패키지는 모듈을 로드할 수 있는 새로운 공간을 열어줍니다.

따라서 우리가 직접 작성한 모듈의 경우 캡슐화되어 PyPi에 게시되면 직접 설치할 수 있습니다. pip를 설치하면 시작 시 메모리에 로드됩니다. sys.modules를 통해 볼 수 있습니다. 이 프로젝트에서 재사용만 필요한 모듈의 경우 재사용 코드의 sys.path에 해당 경로를 추가하고 모듈도 참조할 수 있습니다.

절대 경로 가져오기

모든 모듈 가져오기는 "루트 노드"에서 시작됩니다. 루트 노드의 위치는 sys.path의 경로에 따라 결정됩니다. 프로젝트의 루트 디렉터리는 일반적으로 sys.path에 자동으로 지정됩니다. 프로그램이 모든 곳에서 실행되도록 하려면 sys.path

import sys,os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))#项目根目录所在的绝对路径sys.path.append(BASE_DIR)import A, B #导入A、B包复制代码

상대 경로 가져오기

수동으로 수정해야 합니다. 현재 디렉터리를 기준으로 모듈 위치만 신경 쓰면 됩니다. 패키지 내에서 직접 실행할 수 없습니다(오류가 보고됩니다). 루트 노드가 어디에 있든 패키지 내 모듈의 상대적 위치는 정확합니다.

#from . import b2 #这种导入方式会报错,只有在包内部直接执行的时候才可以这样导入。import b2#正确b2.print_b2()复制代码

Python 모듈 가져오기에 대해 자주 묻는 질문

  • 패키지 이름을 개별적으로 가져올 때 패키지에 포함된 모든 하위 모듈을 가져오지 않습니다. 해결 방법: 가져온 패키지에는 다른 패키지의 가져오기도 포함되어 있습니다. 이때 각 패키지의 init.py 파일에서 해당 패키지 아래의 모든 모듈을 가져와야 합니다. 최상위 계층만 하위 패키지의 클래스를 직접 참조할 수 있습니다. . 및 방법

init 파일

폴더 아래에 init.py가 있으면 해당 폴더가 패키지이고 그 아래에 여러 모듈이 전체를 형성하며 이러한 모듈을 다른 모듈로 가져올 수 있음을 의미합니다. 동일한 패키지를 통해 코드를 작성합니다. 그 중 init.py 파일은 다양한 모듈 간의 참조 관리를 용이하게 하고 패키지 가져오기 동작을 제어하기 위해 패키지를 구성하는 데 사용됩니다.

파일에는 내용이 포함될 수 없습니다. 즉, 빈 파일입니다(비어 있으면 가져오기 [패키지] 형식을 사용하는 것만으로는 아무 작업도 수행할 수 없습니다). 이는 표시와 동일합니다. .

python3에서는 패키지 아래에 init.py 파일이 없더라도 가져오기 패키지는 여전히 오류를 보고하지 않습니다. python2에서는 파일이 패키지 아래에 있어야 합니다. 그렇지 않으면 가져오기 패키지에서 오류를 보고합니다.

allvariables

all은 이 패키지를 가져올 때 [현재 범위]로 가져올 모듈을 지정하는 데 사용되는 중요한 변수입니다*. all 목록에 없는 모듈은 다른 프로그램에서 참조되지 않습니다. all을 다시 쓸 수 있습니다. 예를 들어 all= ['현재 패키지 모듈 1 이름', '모듈 1 이름'] 이렇게 쓰면 목록에 있는 모듈 이름에 따라 가져옵니다

name变量

在包内部直接运行时,包的name == 'main',但是在外部导入包是,可以通过

if __name__ == '__main__':复制代码

来避免实现包内部调试时的逻辑

循环导入

当两个模块A和B之间相互import时,就会出现循环导入的问题,此时程序运行会报错:can not import name xxx,如:

# a.pyprint('from a.py')from b import x

y = 'a'复制代码
# b.pyprint('from b.py')from a import y

x = 'b'复制代码

我们来分析一下这种错误是怎么出现的:

  1. 在sys.modules中查找 符号“module b”;
  2. 如果符号“module b”存在,则获得符号“module b”对应的module对象; 从的dict中获得 符号“x”对应的对象。如果“x”不存在,则抛出异常“ImportError: cannot import name ‘x’”
  3. 如果符号“module b”不存在,则创建一个新的 module对象。不过此时该新module对象的dict为空。然后执行module b.py文件中的语句,填充的dict

因此在a.py中执行from b import x的顺序就是1->3,先引入b,b里面from a import y由相当于执行了a.py,顺序是1->2,因为此时b已经引入所以不会执行3,2中无法找到x对象,因为引入b时还没执行到x='b'这一步,所以报错了

解决办法

  1. 延迟导入,把import语句写在方法/函数里,将它的作用域限制在局部;
  2. 顶层先引入模块,再把from x import y改成import x.y形式;
  3. 其实出现循环引用问题的根本原因是程序设计不合理,每个包都应该由上层使用的模块去导入,而不应该在包与包之间各种相互导入,所以应该更改代码布局,可合并或分离竞争资源;

大型项目中Python模块导入规范

分离模块,将同一类别的模块放在同一目录下,形成类别分明的目录架构,如:

Python 모듈 가져오기 메커니즘과 대규모 프로젝트의 사양을 알아보세요.

  1. 每一个模块目录都要写init.py文件,可以同时定义all限定可导入的范围;
  2. 源码根目录可以定义BASE_DIR,限定好根目录路径,启动py文件可以用绝对路径导入各个模块,将必要模块都加入到sys.path中;
  3. 各个服务之间(例如model需要引入common的模块方法),可以通过相对路径引用模块;
  4. 程序设计时避免循环导入,可由调用者(服务文件)作为上层第三方引入需要的各个模块,这样就可以减少各个模块的相互导入。

更多相关免费学习推荐:python视频教程

위 내용은 Python 모듈 가져오기 메커니즘과 대규모 프로젝트의 사양을 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제