Python Video Tutorial 칼럼에서는 오늘 Python 모듈 가져오기 메커니즘과 대규모 프로젝트의 사양을 배울 수 있는 방법을 소개합니다.
머리말
우리는 일상적인 프로젝트에서 Python을 사용하는 과정에서 각 모듈의 가져오기 문제를 해결해야 하는 경우가 많고 참조 경로 찾기, 모듈 교차 가져오기 등과 같은 문제에 자주 직면합니다. , 그래서 이 글을 썼습니다. 이 글은 Python의 모듈 가져오기 메커니즘과 일상적인 대규모 프로젝트에서 따라야 할 모듈 가져오기 사양을 설명하는 것을 목표로 합니다
Python 모듈 가져오기
일상 프로그래밍에서 작성된 코드 로직을 재사용하기 위해 우리는 코드를 모듈로 캡슐화하여 개발 효율성을 향상시키기 위해 필요할 때 직접 가져오고 재사용할 수 있습니다. 모듈은 함수, 클래스, 변수를 정의할 수 있으며 실행 가능한 코드를 포함할 수도 있습니다. 모듈 소스에는 세 가지 유형이 있습니다. ①Python 내장 모듈(표준 라이브러리); ②타사 모듈; ③사용자 정의 모듈;
가져오기 원칙
모듈 가져오기는 일반적으로 파일 헤더의 import 키워드를 사용하여 수행됩니다. 모듈 가져오기는 가져온 모듈을 한 번 실행한 다음 다음을 사용하여 이 네임스페이스에 모듈을 생성하는 것과 같습니다. 가져온 모듈 모듈 네임스페이스의 연결은 이 네임스페이스에 새 변수를 생성하는 것과 동일합니다. 이 변수의 이름은 가져온 모듈의 이름이며 가져온 모듈의 네임스페이스를 가리킵니다. 따라서 가져온 모듈은 변수와 동일합니다. 따라서 동일한 모듈을 여러 번 가져오는 것은 처음 가져올 때만 실행됩니다. (이후 가져오기에서는 이 모듈 변수가 이미 존재하는 것으로 확인되어 실행되지 않습니다.)
경로 검색 메커니즘
가져온 모든 모듈은 Python의 내장 사전 sys.modules에 저장됩니다. Python이 시작되자마자 메모리에 로드됩니다. 새 모듈을 가져오면 sys.modules가 자동으로 로드됩니다. 모듈을 기록합니다. Python의 모듈 검색 경로 메커니즘은 다음과 같습니다.
- 모듈이 sys.path의 모든 경로에 있는지 확인하고, 그렇다면 모듈을 로드할 새 공간을 엽니다.
- 내장 패키지가 있는지 확인합니다. 또는 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'复制代码
我们来分析一下这种错误是怎么出现的:
- 在sys.modules中查找 符号“module b”;
- 如果符号“module b”存在,则获得符号“module b”对应的module对象; 从的dict中获得 符号“x”对应的对象。如果“x”不存在,则抛出异常“ImportError: cannot import name ‘x’”
- 如果符号“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'这一步,所以报错了
解决办法
- 延迟导入,把import语句写在方法/函数里,将它的作用域限制在局部;
- 顶层先引入模块,再把from x import y改成import x.y形式;
- 其实出现循环引用问题的根本原因是程序设计不合理,每个包都应该由上层使用的模块去导入,而不应该在包与包之间各种相互导入,所以应该更改代码布局,可合并或分离竞争资源;
大型项目中Python模块导入规范
分离模块,将同一类别的模块放在同一目录下,形成类别分明的目录架构,如:
- 每一个模块目录都要写init.py文件,可以同时定义all限定可导入的范围;
- 源码根目录可以定义BASE_DIR,限定好根目录路径,启动py文件可以用绝对路径导入各个模块,将必要模块都加入到sys.path中;
- 各个服务之间(例如model需要引入common的模块方法),可以通过相对路径引用模块;
- 程序设计时避免循环导入,可由调用者(服务文件)作为上层第三方引入需要的各个模块,这样就可以减少各个模块的相互导入。
更多相关免费学习推荐:python视频教程
위 내용은 Python 모듈 가져오기 메커니즘과 대규모 프로젝트의 사양을 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

2 시간 이내에 Python의 기본 프로그래밍 개념과 기술을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우기, 2. 마스터 제어 흐름 (조건부 명세서 및 루프), 3. 기능의 정의 및 사용을 이해하십시오. 4. 간단한 예제 및 코드 스 니펫을 통해 Python 프로그래밍을 신속하게 시작하십시오.

Python은 웹 개발, 데이터 과학, 기계 학습, 자동화 및 스크립팅 분야에서 널리 사용됩니다. 1) 웹 개발에서 Django 및 Flask 프레임 워크는 개발 프로세스를 단순화합니다. 2) 데이터 과학 및 기계 학습 분야에서 Numpy, Pandas, Scikit-Learn 및 Tensorflow 라이브러리는 강력한 지원을 제공합니다. 3) 자동화 및 스크립팅 측면에서 Python은 자동화 된 테스트 및 시스템 관리와 같은 작업에 적합합니다.

2 시간 이내에 파이썬의 기본 사항을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우십시오. 이를 통해 간단한 파이썬 프로그램 작성을 시작하는 데 도움이됩니다.

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

Python 3.6에 피클 파일로드 3.6 환경 보고서 오류 : modulenotfounderror : nomodulename ...

경치 좋은 스팟 댓글 분석에서 Jieba Word 세분화 문제를 해결하는 방법은 무엇입니까? 경치가 좋은 스팟 댓글 및 분석을 수행 할 때 종종 Jieba Word 세분화 도구를 사용하여 텍스트를 처리합니다 ...

정규 표현식을 사용하여 첫 번째 닫힌 태그와 정지와 일치하는 방법은 무엇입니까? HTML 또는 기타 마크 업 언어를 다룰 때는 정규 표현식이 종종 필요합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

WebStorm Mac 버전
유용한 JavaScript 개발 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
