-m 스위치의 용도는 무엇입니까?
전화하는 것과 전화하는 것의 차이점을 설명해 주시겠습니까?
python -m mymod1 mymod2.py args
그리고.
python mymod1.py mymod2.py args
두 경우 모두 그런 것 같다mymod1.py
라고 불리며sys.argv
이
['mymod1.py', 'mymod2.py', 'args']
그럼 뭐?-m
바꿀까요?
의 첫 번째 줄Rationale
PEP 338의 섹션은 다음과 같습니다.
Python 2.4는 명령행 switch -m을 추가하여 스크립트로 실행할 Python 모듈 이름 공간을 사용하여 모듈을 찾을 수 있도록 합니다.예를 들어 pdb 및 profile과 같은 표준 라이브러리 모듈을 들 수 있으며 Python 2.4 구현은 제한된 용도로도 괜찮습니다.
따라서 Python의 검색 경로에 있는 모듈을 지정할 수 있으며, 현재 디렉토리의 파일만 지정할 수 없습니다.맞아요.python mymod1.py mymod2.py args
정확히 같은 효과가 있습니다.의 첫 번째 줄Scope of this proposal
섹션 상태:
Python 2.4에서는 -m을 사용하여 배치된 모듈이 명령줄에 파일 이름이 제공된 것처럼 실행됩니다.
와 함께-m
패키지의 일부인 모듈로 작업하는 등 더 많은 것이 가능합니다.그게 PEP 338의 나머지 내용이에요자세한 내용은 여기를 참조해 주세요.
이 질문(예: 여기, 여기, 여기, 여기, 여기)이 여러 번 질문되고 답변되었음에도 불구하고, 제 생각에 기존의 어떤 답변도 전체 또는 간결하게 모든 의미를 담아내지 못했습니다.-m
따라서, 다음은 이전에 있었던 것을 개선하려는 시도를 할 것입니다.
개요(TLDR)
그-m
flag는 많은 일을 하지만 항상 필요한 것은 아닙니다.즉, 다음과 같이 사용할 수 있습니다. (1) 명령행에서 filename(2)이 아닌 modulename을 통해 python 코드를 실행합니다.sys.path
에 사용하기 위해서import
resolution 및 (3) 명령줄에서 상대적인 Import를 포함하는 python 코드를 실행합니다.
예단
설명하자면-m
먼저 용어를 설명해야 합니다.
Python의 주요 조직 단위는 모듈로 알려져 있습니다.모듈에는 코드 모듈과 패키지 모듈의 두 가지 맛 중 하나가 있습니다.코드 모듈은 python 실행 가능 코드가 포함된 파일입니다.패키지 모듈은 다른 모듈(코드 모듈 또는 패키지 모듈)을 포함하는 디렉토리입니다.코드 모듈의 가장 일반적인 유형은 다음과 같습니다.*.py
패키지 모듈의 가장 일반적인 유형은 파일입니다.__init__.py
파일.
Python은 모듈 이름과 파일 이름이라는 두 가지 다른 방법으로 모듈을 고유하게 식별할 수 있도록 합니다.일반적으로 모듈은 Python 코드의 모듈명으로 식별됩니다(예:import <modulename>
명령줄의 파일 이름(예:python <filename>
모든 python 인터프리터는 동일한 몇 가지 명확한 규칙을 따름으로써 모듈명을 파일명으로 변환할 수 있습니다.이 규칙들은 에 따라 달라집니다.sys.path
변수.이 변수를 변경하면 Python이 모듈명을 파일명으로 해결하는 방법을 변경할 수 있습니다(자세한 내용은 PEP 302 참조).
모든 모듈(코드 및 패키지 모두)을 실행할 수 있습니다(즉, 모듈과 관련된 코드가 Python 인터프리터에 의해 평가됩니다).실행 방법(및 모듈 유형)에 따라 평가되는 코드와 시기가 크게 달라질 수 있습니다.을 " " 를 통해 python <filename>
<filename>/__main__.py
모듈을 에서 실행하면 같은 via via via via via via via모듈이 실행됩니다.import <modulename>
'''만''입니다.__init__.py
행됩니니다다
의의의 -m
-m
플래그는 Python 2.4.1에서 처음 도입되었습니다.처음에는 명령줄에서 실행할 파이썬 모듈을 식별하는 대체 수단을 제공하는 것이 유일한 목적이었습니다.즉, 만약 우리가 이 두 가지를 모두 안다면<filename>
★★★★★★★★★★★★★★★★★」<modulename>
에서는 다음 두합니다: 개음음개개개 2 개개개개개개개 for개 。python <filename> <args>
★★★★★★★★★★★★★★★★★」python -m <modulename> <args>
PEP 338에 따르면 이 반복으로 인한 한 가지 제약사항은 다음과 같다.-m
는 톱 사용 합니다.sys.path
의
PEP 338의 완료와 함께-m
되어 「」를 서포트하고 있습니다.<modulename>
최상위 수준을 넘어선 표현입니다.은 이름, 를 들면 이름 것을 했습니다.http.server
이치노 각 패키지 「」가 평가되게 되었습니다).__init__.py
모듈명 자체에서 참조되는 모듈 외에 파일도 평가되었습니다.
「 」의 확장-m
PEP 366이 부속되어 있습니다.이 업그레이드와 함께-m
모듈을 실행할 때 절대 Import뿐만 아니라 명시적인 상대 Import도 지원할 수 있게 되었습니다.이것은 변경에 의해 달성되었습니다.-m
ㅇㅇㅇㅇㅇ가 되고,__package__
지정된 모듈명의 부모 모듈(이미 실행한 다른 모든 것 외에)에 대한 변수입니다.
사용 사례
에는, 다음의 2개의 중요한 사용 사례가 있습니다.-m
삭제:
명령줄에서 모듈의 파일 이름을 모를 수 있는 모듈을 실행합니다.이 사용 사례는 Python 인터프리터가 모듈 이름을 파일 이름으로 변환하는 방법을 알고 있다는 사실을 활용합니다.이는 명령줄에서 stdlib 모듈 또는 서드파티 모듈을 실행하는 경우에 특히 유용합니다.를 들어,만이 그 을 알고 .
http.server
모듈명을 알고 있기 때문에 명령줄에서 실행할 수 있습니다.python -m http.server
.절대 또는 상대 Import를 포함하는 로컬 패키지를 설치할 필요 없이 실행합니다.이 사용 사례는 PEP 338에 자세히 설명되어 있으며, 현재 작업 디렉토리가 에 추가되어 있다는 사실을 활용합니다.
sys.path
모듈 디렉토리가 아닌이 사용 사례는 다음과 같습니다.pip install -e .
패키지를 개발/편집 모드로 설치합니다.
단점
모든 기능 강화로-m
몇 년 동안 Python으로 작성된 모듈만 실행할 수 있다는 단점이 있습니다(즉,*.py
예를 들어 다음과 같습니다.-m
C 컴파일된 코드모듈 실행에 사용됩니다.다음 오류가 발생합니다.No code object available for <modulename>
(자세한 내용은 여기를 참조해 주세요).
상세 비교
Import 스테이트먼트를 통한 모듈 실행(즉,import <modulename>
):
sys.path
어떤 식으로도 수정되지 않습니다.__name__
의 절대적인 형태로 설정되어 있다.<modulename>
__package__
에서 직접 부모 패키지로 설정됩니다.<modulename>
__init__.py
모든 패키지에 대해 평가됩니다(패키지 모듈용 자체 패키지 포함).__main__.py
패키지 모듈에서는 평가되지 않습니다.코드는 코드 모듈에 대해 평가됩니다.
명령줄을 통한 모듈 실행(파일 이름 포함)python <filename>
):
sys.path
최종 디렉토리를 포함하도록 변경되었습니다.<filename>
__name__
로 설정되어 있다.'__main__'
__package__
로 설정되어 있다.None
__init__.py
패키지(패키지 모듈용 패키지 포함)에 대해 평가되지 않습니다.__main__.py
는 패키지 모듈에 대해 평가되며 코드는 코드 모듈에 대해 평가됩니다.
모듈명을 가진 명령줄을 통한 모듈 실행(즉,python -m <modulename>
):
sys.path
현재 디렉토리를 포함하도록 수정되었습니다.__name__
로 설정되어 있다.'__main__'
__package__
에서 직접 부모 패키지로 설정됩니다.<modulename>
__init__.py
모든 패키지에 대해 평가됩니다(패키지 모듈용 자체 패키지 포함).__main__.py
패키지 모듈에 대해 평가되며 코드는 코드 모듈에 대해 평가됩니다.
결론
그-m
flag는 파일명이 아닌 모듈명을 사용하여 명령줄에서 python 스크립트를 실행하는 가장 간단한 수단입니다.진정한 힘-m
그러나, 그 힘을 결합하는 능력에 있다.import
명세서(예: 명시적 상대 수입 및 자동 패키지 지원)__init__
(평가) 명령줄을 편리하게 사용할 수 있습니다.
패키지에 파일이 있는 경우에만 이 기능이 작동합니다.그렇지 않으면 이 패키지를 직접 실행할 수 없습니다.
python -m some_package some_arguments
python interpreter는 python을 찾습니다.__main__.py
실행할 패키지 경로에 파일이 있습니다.이는 다음과 같습니다.
python path_to_package/__main__.py somearguments
컨텐츠는, 다음의 후에 실행됩니다.
if __name__ == "__main__":
저는 혼란스러울 수 있는 한 가지 사례를 언급하고 싶습니다.
를 사용한다고 가정합니다.pip3
패키지를 설치하다foo
(이것들이포함되어 있습니다.bar
모듈.즉, 실행이 가능합니다.python3 -m foo.bar
모든 디렉토리에서.한편, 디렉토리 구조는 다음과 같습니다.
src
|
+-- foo
|
+-- __init__.py
|
+-- bar.py
에 있습니다.src/
. 달릴 때python -m foo.bar
, 를 실행하고 있다.bar.py
(설치된 모듈 대신).다만, 전화하고 있는 경우는,python -m foo.bar
설치된 모듈을 사용하고 있습니다.
이 동작은, 이 디바이스를 사용하고 있는 경우는, 확실히 발생하지 않습니다.python
대신python -m
초심자에게는 혼란스러울 수 있습니다.그 이유는 Python이 모듈을 검색하는 순서입니다.
언급URL : https://stackoverflow.com/questions/7610001/what-is-the-purpose-of-the-m-switch
'programing' 카테고리의 다른 글
MariaDB는 비대칭 키 암호화를 제공합니까? (0) | 2022.09.13 |
---|---|
공백을 밑줄로 바꾸기 (0) | 2022.09.13 |
Galera 클러스터와의 중요한 읽기 및 느린 동기화 테스트 방법 (0) | 2022.09.13 |
Java HTTPS 클라이언트 증명서 인증 (0) | 2022.09.13 |
XAMPP에서 phpMyAdmin을 사용하여 "구성에서 정의된 controluser에 대한 연결에 실패했습니다." (0) | 2022.09.12 |