머리말
Python에서 모듈을 구성하는 방법에는 두 가지가 있습니다. 하나는 간단한 Python 파일, 파일 이름은 모듈 이름, 다른 하나는 패키지, 패키지는 여러 Python 파일이 포함된 디렉터리입니다. . 디렉터리에 __init__.py 파일이 있어야 하므로 디렉터리 이름은 모듈 이름입니다. import
import 구문
import Module import Module as xx2. , 함수, 변수 등)
from Module import Name from Module immport Name as yy구문은 객체의 별칭을 설정하는 데 사용되며(여기서 객체는 모듈, 클래스, 함수 등을 나타냄) import는 현재 파일의 네임스페이스에 개체 이름 다음 디렉터리 구조가 있다고 가정
├── A.py └── pkg ├── B.py └── __init__.py현재 디렉터리에서 다음 명령문이 유효합니다
import A import pkg import pkg.B from pkg import B논의를 단순화하기 위해 다음에서는 구문가져오기 단계
#filename: A.py from B import BB class AA:pass #filename: B.py from A import AA class BB:pass와 같은 상황이 발생합니다. , A.py를 실행하든 B.py를 실행하든 ImportError 예외가 발생합니다. A.py를 실행한다고 가정하면 그 이유는 다음과 같습니다B에서 A.py 파일을 실행할 때. import BB, B.py가 먼저 스캔되고 A의 네임스페이스에서 B에 대한 모듈 객체가 생성되어 B에서 BB를 찾으려고 합니다B.py를 먼저 스캔합니다. 이때 A에서 import AA를 실행합니다. , A.py를 스캔하고 A.py의 첫 번째 줄을 스캔하여 B import BB를 실행합니다. 1단계에서 B에 대해 모듈 객체를 생성했으므로 B에서 직접 가져옵니다. 이때 모듈 객체의 __dict__는 BB를 얻을 수 없다는 것이 명백하므로 예외가 발생합니다.
다음과 같은 디렉터리 구조가 있다고 가정합니다
pkg ├── __init__.py └── file.py__init__.py의 내용은 다음과 같습니다
argument = 0 class A:pass해도 괜찮습니다. pkg
>>> import pkg >>> import pkg.file >>> from pkg import file >>> from pkg import A >>> from pkg import argument그러나 다음 명령문은 잘못되었습니다
>>> import pkg.A >>> import pkg.argumentImportError: xxx라는 모듈이 없습니다. 왜냐하면 import A.B를 실행할 때 A와 B는 모두 모듈(파일 또는 패키지)이어야 합니다상대 가져오기 및 절대 가져오기
디렉토리 구조는 다음과 같습니다
app ├── __inti__.py ├── mod1 │ ├── file1.py │ └── __init__.py ├── mod2 │ ├── file2.py │ └── __init__.py └── start.pyapp/start.py의 내용은 import mod1.file1
A ├── B1 │ ├── C1 │ │ └── file.py │ └── C2 └── B2
其中A,B1,B2,C1,C2都为包,这里为了展示简单没有列出__init__.py文件,当file.py的包结构为A.B1.C1.file(注意,是根据__name__来的,而不是磁盘的目录结构,在不同目录下执行file.py时对应的包目录结构都是不一样的)时,在file.py中可采用如下的绝对的导入
import A.B1.C2 import A.B2
和如下的相对导入
from .. import C2 from ... import B2
什么情况下会让file.py的包结构为A.B1.C1.file呢,有如下两种
在A的上层目录执行python -m A.B1.C1.file, 此时明确指定了包结构
在A的上层目录建立文件start.py,在start.py里有import A.B1.C1.file,然后执行python start.py,此时包结构是根据file.py的__name__变量来的
再看前面出错的两种情况,第一种执行python file1.py和python mod1/file1.py,此时file.py的__name__为__main__ ,也就是说它本身就是顶层模块,并没有包结构,所以会报错
第二种情况,在执行python -m mod1.file1和python start.py时,前者明确告诉解释器mod1是顶层模块,后者需要导入file1,而file1.py的__name__为mod1.file1,顶层模块为也mod1,所以在file1.py中执行from ..mod2 import file2时会报错 ,因为mod2并不在顶层模块mod1内部。通过错误堆栈可以看出,并不是在start.py中绝对导入时报错,而是在file1.py中相对导入报的错
那么如何才能偶正确执行呢,有两种方法,一种是在app上层目录执行python -m app.mod1.file1,另一种是改变目录结构,将所有包放在一个大包中,如下
app ├── pkg │ ├── __init__.py │ ├── mod1 │ │ ├── __init__.py │ │ └── file1.py │ └── mod2 │ ├── __init__.py │ └── file2.py └── start.py
start.py内容改成import pkg.mod1.file1,然后在app下执行python start.py
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如有疑问大家可以留言交流。
更多python中import学习备忘笔记相关文章请关注PHP中文网!