Python3 모듈
이전 장에서는 Python 인터프리터를 사용하여 스크립트를 프로그래밍했습니다. 종료한 다음 Python 인터프리터에 들어가면 정의한 모든 메서드와 변수가 사라집니다.
이를 위해 Python은 일부 스크립트 또는 대화형 인터프리터 인스턴스에서 사용할 수 있도록 이러한 정의를 파일에 저장하는 방법을 제공합니다.
모듈은 여러분이 정의한 모든 함수와 변수가 포함된 파일이며, 접미사는 .py입니다. 모듈은 모듈의 기능 및 기타 기능을 사용하기 위해 다른 프로그램에서 가져올 수 있습니다. 이는 Python 표준 라이브러리를 사용하여 수행됩니다.
다음은 Python 표준 라이브러리의 모듈을 사용한 예입니다.
#!/usr/bin/python3 # 文件名: using_sys.py import sys print('命令行参数如下:') for i in sys.argv: print(i) print('\n\nPython 路径为:', sys.path, '\n')
실행 결과는 다음과 같습니다.
$ python using_sys.py 参数1 参数2 命令行参数如下: using_sys.py 参数1 参数2 Python 路径为: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
1. import sys는 Python 표준 라이브러리에 sys.py 모듈을 도입하는 방식입니다.
2. sys.argv는 명령줄 매개변수가 포함된 목록입니다.
3. sys.path에는 Python 인터프리터가 자동으로 필요한 모듈을 찾는 경로 목록이 포함되어 있습니다.
import 문
Python 소스 파일을 사용하려면 다른 소스 파일에서 import 문을 실행하면 됩니다. 구문은 다음과 같습니다.
import module1[, module2[,... moduleN]
인터프리터가 import 문을 발견하면 모듈이 다음과 같습니다. 현재 검색 경로에서는 가져옵니다.
검색 경로는 통역사가 먼저 검색할 모든 디렉터리의 목록입니다. 모듈 지원을 가져오려면 스크립트 상단에 명령을 넣어야 합니다:
support.py 파일 코드:
#!/usr/bin/python3 # Filename: support.py def print_func( par ): print ("Hello : ", par) return
test.py 지원 모듈 소개:
#!/usr/bin/python3 # Filename: test.py # 导入模块 import support # 现在可以调用模块里包含的函数了 support.print_func("php")
출력 결과 위의 예:
$ python3 test.py Hello : php
모듈은 가져오기를 몇 번 실행하든 관계없이 한 번만 가져옵니다. 이렇게 하면 가져온 모듈이 반복해서 실행되는 것을 방지할 수 있습니다.
import 문을 사용할 때 Python 인터프리터는 해당 파일을 어떻게 찾나요?
여기에는 Python의 검색 경로가 포함됩니다. 검색 경로는 일련의 디렉터리 이름으로 구성됩니다. Python 인터프리터는 이러한 디렉터리에서 가져온 모듈을 차례로 찾습니다.
실제로는 환경 변수를 정의하여 검색 경로를 결정할 수도 있습니다.
검색 경로는 Python을 컴파일하거나 설치할 때 결정되며, 새 라이브러리를 설치할 때도 수정해야 합니다. 검색 경로는 sys 모듈의 경로 변수에 저장됩니다. 간단한 실험을 수행하려면 대화형 해석기에서 다음 코드를 입력하세요.
>>> import sys >>> sys.path ['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'] >>>
sys.path 출력은 목록이며 첫 번째 항목은 빈 문자열입니다. '', 현재 디렉터리(스크립트에서 인쇄된 경우 어떤 디렉터리인지 더 명확하게 알 수 있음), 즉 Python 인터프리터를 실행하는 디렉터리(스크립트의 경우 실행 중인 스크립트가 있는 디렉터리)를 나타냅니다. ).
그래서 저처럼 현재 디렉터리에 import할 모듈과 같은 이름의 파일이 있으면 import하려는 모듈이 차단됩니다.
검색 경로의 개념을 이해한 후 스크립트에서 sys.path를 수정하여 검색 경로에 없는 일부 모듈을 도입할 수 있습니다.
이제 인터프리터의 현재 디렉터리나 sys.path의 디렉터리에 fibo.py 파일을 만듭니다.
# 斐波那契(fibonacci)数列模块 def fib(n): # 定义到 n 的斐波那契数列 a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b print() def fib2(n): # 返回到 n 的斐波那契数列 result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result
그런 다음 Python 인터프리터에 들어가서 다음 명령을 사용하여 이 모듈을 가져옵니다.
>>> import fibo
이것은 fibo에 직접 정의된 함수 이름을 현재 기호 테이블에 쓰지 않고 거기에 fibo 모듈의 이름만 씁니다.
모듈 이름을 사용하여 함수에 액세스할 수 있습니다.
>>> fibo.fib(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo.fib2(100) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo.__name__ 'fibo'
함수를 자주 사용할 계획이라면 로컬 이름을 할당할 수 있습니다.
>>> fib = fibo.fib >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
from...import 문
Python의 from 문을 사용하면 to import from 모듈의 지정된 부분을 현재 네임스페이스로 가져오려면 구문은 다음과 같습니다.
from modname import name1[, name2[, ... nameN]]
예를 들어 fibo 모듈의 fib 함수를 가져오려면 다음 문을 사용합니다.
from fibo import fib
이 문은 전체 fib 모듈을 현재 네임스페이스로 가져오면 이 선언을 실행하는 모듈의 전역 기호 테이블에 fib의 단일 fibonacci만 도입됩니다.
From...import* 문
모듈의 모든 내용을 현재 네임스페이스로 가져올 수도 있습니다. 다음 선언을 사용하세요.
from modname import *
이것은 모듈을 가져오는 간단한 방법을 제공합니다. 모든 프로젝트 . 그러나 이 진술을 남용해서는 안 됩니다.
모듈 심층 분석
메서드 정의 외에도 모듈에는 실행 가능한 코드가 포함될 수도 있습니다. 이 코드는 일반적으로 이 모듈을 초기화하는 데 사용됩니다. 이 코드는 처음 가져올 때만 실행됩니다.
각 모듈에는 모듈 내부의 모든 기능에 대한 전역 기호 테이블로 사용되는 자체 독립 기호 테이블이 있습니다.
그래서 모듈 작성자는 다른 사용자의 전역 변수를 망칠 염려 없이 모듈 내에서 이러한 전역 변수를 안전하게 사용할 수 있습니다.
반면에, 자신이 무엇을 하고 있는지 정말로 알고 있다면 modname.itemname과 같은 표기법을 통해 모듈 내의 기능에 액세스할 수도 있습니다.
모듈은 다른 모듈을 가져올 수 있습니다. 모듈을 가져오기 위해 모듈(또는 스크립트 또는 다른 곳)의 시작 부분에서 import를 사용하는 것은 물론 요구 사항이 아니라 관례일 뿐입니다. 가져온 모듈의 이름은 현재 작동 중인 모듈의 심볼 테이블에 배치됩니다.
import 방법을 사용하여 모듈에 있는 (함수 및 변수의) 이름을 현재 작업 모듈로 직접 가져올 수도 있습니다. 예:
>>> from fibo import fib, fib2 >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
이 가져오기 방법은 가져온 모듈의 이름을 현재 문자 테이블에 넣지 않습니다(따라서 이 예에서는 fibo라는 이름이 정의되지 않습니다).
모듈의 모든 (함수, 변수) 이름을 현재 모듈의 문자표로 한 번에 가져오는 방법도 있습니다:
>>> from fibo import * >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
이렇게 하면 모든 이름을 가져오지만 단일 밑줄이 있는 이름은 (_로 시작합니다. )은 이 예에 포함되지 않습니다. 대부분의 경우 Python 프로그래머는 다른 소스의 이름을 도입하면 기존 정의를 덮어쓸 가능성이 높기 때문에 이 방법을 사용하지 않습니다.
__name__ attribute
모듈이 다른 프로그램에 의해 처음 소개되면 해당 모듈의 기본 프로그램이 실행됩니다. 모듈을 가져올 때 모듈의 특정 프로그램 블록이 실행되지 않도록 하려면 __name__ 속성을 사용하여 모듈 자체가 실행될 때만 프로그램 블록이 실행되도록 할 수 있습니다.
#!/usr/bin/python3 # Filename: using_name.py if __name__ == '__main__': print('程序自身在运行') else: print('我来自另一模块')
실행 출력은 다음과 같습니다.
$ python using_name.py
프로그램 자체가 실행 중입니다
$ python >>> import using_name 我来自另一模块 >>>
설명:각 모듈에는 __name__ 속성이 있습니다. 해당 값이 '__main__'이면 모듈 자체가 실행 중임을 나타내고, 그렇지 않으면 가져옵니다.
dir() 함수
内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回: </p> <pre> >>> import fibo, sys >>> dir(fibo) ['__name__', 'fib', 'fib2'] >>> dir(sys) ['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions']
매개 변수가 지정되지 않으면 dir() 함수는 현재 정의된 모든 이름을 나열합니다.
>>> a = [1, 2, 3, 4, 5] >>> import fibo >>> fib = fibo.fib >>> dir() # 得到一个当前模块中定义的属性列表 ['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys'] >>> a = 5 # 建立一个新的变量 'a' >>> dir() ['__builtins__', '__doc__', '__name__', 'a', 'sys'] >>> >>> del a # 删除变量名a >>> >>> dir() ['__builtins__', '__doc__', '__name__', 'sys'] >>>
표준 모듈
Python 자체에는 일부 표준 모듈 라이브러리가 포함됩니다. Python 라이브러리 참조 문서(즉, 나중에 "라이브러리 참조 문서")에 있습니다.
일부 모듈은 파서에 직접 내장되어 있습니다. 일부 언어의 내장 기능은 아니지만 매우 효율적으로 사용할 수 있으며 시스템 수준 호출에도 문제가 없습니다.
이러한 구성 요소는 운영 체제에 따라 다른 방식으로 구성됩니다. 예를 들어 winreg 모듈은 Windows 시스템에만 제공됩니다.
모든 Python 파서에는 특수 모듈 sys가 내장되어 있다는 점에 유의해야 합니다. sys.ps1 및 sys.ps2 변수는 기본 프롬프트와 보조 프롬프트에 해당하는 문자열을 정의합니다.
>>> import sys >>> sys.ps1 '>>> ' >>> sys.ps2 '... ' >>> sys.ps1 = 'C> ' C> print('Yuck!') Yuck! C>
Package
Package는 "점 모듈 이름"을 사용하여 Python 모듈 네임스페이스를 관리하는 형식입니다.
예를 들어 모듈 이름이 A.B인 경우 이는 패키지 A의 하위 모듈 B를 나타냅니다.
모듈을 사용할 때와 마찬가지로 서로 다른 모듈 간의 전역 변수의 상호 영향을 걱정할 필요가 없습니다. 도트 모듈 이름 형식을 사용하면 서로 다른 라이브러리 간의 모듈 이름이 중복되는 것을 걱정할 필요가 없습니다.
이러한 방식으로 다양한 작성자가 NumPy 모듈이나 Python 그래픽 라이브러리를 제공할 수 있습니다.
사운드 파일과 데이터를 통합된 방식으로 처리하는 모듈 세트(또는 "패키지"라고 함)를 디자인한다고 가정해 보겠습니다.
다양한 오디오 파일 형식(기본적으로 .wav, :file:.aiff, :file:.au와 같은 접미사 이름으로 구분)이 있으므로 점점 더 많은 모듈 세트가 필요합니다. 다른 형식으로 변환합니다.
그리고 이 오디오 데이터에는 믹싱, 에코 추가, 이퀄라이저 기능 추가, 인공 스테레오 효과 생성 등 다양한 작업이 있으므로 이러한 작업을 처리하려면 끝없는 모듈 세트가 필요합니다.
가능한 패키지 구조는 다음과 같습니다(계층적 파일 시스템에서):
sound/ 顶层包 __init__.py 初始化 sound 包 formats/ 文件格式转换子包 __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... effects/ 声音效果子包 __init__.py echo.py surround.py reverse.py ... filters/ filters 子包 __init__.py equalizer.py vocoder.py karaoke.py ...
패키지를 가져올 때 Python은 sys.path의 디렉터리를 기반으로 패키지에 포함된 하위 디렉터리를 찾습니다.
디렉토리는 __init__.py라는 파일이 포함된 경우에만 패키지로 인식됩니다. 이는 주로 일부 진부한 이름(예: 문자열)이 검색 경로의 유효한 모듈에 실수로 영향을 미치는 것을 방지하기 위한 것입니다.
가장 간단한 경우에는 빈 :file:__init__.py를 넣으세요. 물론 이 파일에는 일부 초기화 코드가 포함될 수도 있고 __all__ 변수에 값을 할당할 수도 있습니다(추후 소개 예정).
사용자는 한 번에 하나의 패키지에 있는 특정 모듈만 가져올 수 있습니다. 예:
import sound.effects.echo
이렇게 하면 하위 모듈인 mod:song.효과.echo를 가져옵니다. 액세스하려면 전체 이름을 사용해야 합니다:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
하위 모듈을 가져오는 방법도 있습니다:
from sound.effects import echo
이것은 또한 하위 모듈인 mod:echo를 가져오며 긴 접두사가 필요하지 않으므로 다음과 같이 사용할 수 있습니다.
echo.echofilter(input, output, delay=0.7, atten=4)
또 다른 변형은 함수나 변수를 직접 가져오는 것입니다:
from sound.effects.echo import echofilter
마찬가지로, 이 방법은 하위 모듈 :mod:echo를 가져오고, 해당 :func:echofilter 기능을 직접 사용할 수 있습니다:
echofilter(input,output,delay=0.7, atten=4)
패키지 가져오기 항목에서 사용할 때 다음을 참고하세요. 양식에서 해당 항목은 패키지 내의 서브모듈(서브패키지)일 수도 있고, 함수, 클래스, 변수 등 패키지에 정의된 다른 이름일 수도 있습니다.
가져오기 구문은 먼저 항목을 패키지 정의의 이름으로 처리합니다. 항목이 없으면 모듈로 가져오려고 합니다. 아직 찾지 못했다면 축하합니다. :exc:ImportError 예외가 발생했습니다.
반대로 import item.subitem.subsubitem과 같은 가져오기 형식을 사용하는 경우 마지막 항목을 제외하고 모두 패키지여야 하며, 마지막 항목은 모듈이나 패키지일 수 있지만 클래스는 될 수 없습니다. , 함수 또는 변수 이름.
패키지에서 * 가져오기
from sound.효과 가져오기 *를 사용하면 어떻게 될지 상상해 보세요.
Python은 파일 시스템에 들어가서 이 패키지의 모든 하위 모듈을 찾아 하나씩 가져옵니다.
하지만 안타깝게도 이 방법은 Windows 플랫폼에서는 잘 작동하지 않습니다. Windows는 대소문자를 구분하지 않는 시스템이기 때문입니다.
이 유형의 플랫폼에서는 누구도 ECHO.py라는 파일을 mod:echo 또는 mod:Echo 또는 mod:ECHO 모듈로 가져오도록 보장할 수 없습니다.
(예를 들어 Windows 95는 각 파일의 첫 글자를 대문자로 표시하기 귀찮습니다.) DOS의 8+3 명명 규칙은 긴 모듈 이름을 처리하므로 문제가 더욱 복잡해집니다.
이 문제를 해결하려면 패키지 작성자에게 정확한 패키지 색인을 요청하는 수밖에 없습니다.
Import 문은 다음 규칙을 따릅니다. 패키지 정의 파일 __init__.py에 __all__이라는 목록 변수가 있는 경우 from package import *를 사용할 때 이 목록의 모든 이름을 패키지 콘텐츠로 가져옵니다.
패키지 작성자로서 패키지 업데이트 후 __all__도 업데이트되었는지 확인하는 것을 잊지 마세요. 나는 이것을하지 않을 것이라고 말했습니다. 나는 import *를 사용하지 않을 것입니다. 알겠습니다. 문제 없습니다. 누가 당신을 상사로 만듭니다. 다음은 예입니다. file:sounds/ Effects/__init__.py에는 다음 코드가 포함되어 있습니다.
__all__ = ["echo", "surround", "reverse"]
이는 from sound.효과 import *를 사용할 때 패키지에서만 이를 가져오게 됨을 의미합니다. 세 개의 하위 모듈 .
__all__이 true이지만 정의되지 않은 경우 sound.효과 가져오기 *의 구문을 사용할 때 package:mod:sound.효과에 있는 모든 하위 모듈을 가져오지 *않습니다*. 단지 :mod:sound.효과 패키지와 그 안에 정의된 모든 것을 가져옵니다(아마도 :file:__init__.py에 정의된 초기화 코드 실행).
이렇게 하면 :file:__init__.py에 정의된 모든 이름을 가져옵니다. 그리고 이 문장 이전에 가져온 명시적으로 지정된 모든 모듈을 삭제하지 않습니다. 코드의 이 부분을 살펴보세요.
import sound.effects.echo import sound.effects.surround from sound.effects import *
이 예에서는 from...import를 실행하기 전에 package:mod:sound.effs의 echo 및 Surround 모듈을 현재 네임스페이스로 가져옵니다. (물론 __all__이 정의되어 있으면 문제가 되지 않습니다.)
일반적으로 우리는 * 이 방법을 사용하여 모듈을 가져오는 것을 권장하지 않습니다. 이 방법은 종종 코드 가독성을 떨어뜨리기 때문입니다. 그러나 이렇게 하면 키 입력이 많이 절약되고 일부 모듈은 특정 방법을 통해서만 가져오도록 설계되었습니다.
패키지 가져오기 특정 하위 모듈에서 사용하는 데 아무런 문제가 없다는 것을 기억하세요. 실제로 이는 권장되는 접근 방식입니다. 가져오려는 하위 모듈이 다른 패키지의 하위 모듈과 동일한 이름을 갖지 않는 한.
패키지가 구조의 하위 패키지(예: 이 예에서는 mod:sound 패키지)이고 형제 패키지(동일한 레벨의 패키지)를 가져오려면 다음을 사용해야 합니다. 가져올 절대 경로를 가져옵니다. 예를 들어, :mod:sound.filters.vocoder 모듈이 :mod:sound. Effects 패키지의 :mod:echo 모듈을 사용하려는 경우 from sound. Effects import echo를 작성하면 됩니다.
from . import echo from .. import formats from ..filters import equalizer
암시적 또는 명시적 상대 가져오기가 현재 모듈에서 시작되는지 여부입니다. 메인 모듈의 이름은 항상 "__main__"입니다. Python 애플리케이션의 메인 모듈은 항상 절대 경로를 사용하여 참조되어야 합니다.
패키지는 추가 속성인 :attr:__path__도 제공합니다. 이것은 디렉토리 목록입니다. 포함된 각 디렉토리에는 이 패키지를 제공하는 :file:__init__.py가 실행되기 전에 다른 :file:__init__.py를 정의해야 합니다. 이 변수를 수정하여 패키지에 포함된 모듈과 하위 패키지에 영향을 줄 수 있습니다.
이 기능은 일반적으로 사용되지 않으며 일반적으로 패키지 내 모듈을 확장하는 데 사용됩니다.