programing

-m 스위치의 용도는 무엇입니까?

randomtip 2022. 9. 13. 21:51
반응형

-m 스위치의 용도는 무엇입니까?

전화하는 것과 전화하는 것의 차이점을 설명해 주시겠습니까?

python -m mymod1 mymod2.py args

그리고.

python mymod1.py mymod2.py args

두 경우 모두 그런 것 같다mymod1.py라고 불리며sys.argv

['mymod1.py', 'mymod2.py', 'args']

그럼 뭐?-m바꿀까요?

의 첫 번째 줄RationalePEP 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)

-mflag는 많은 일을 하지만 항상 필요한 것은 아닙니다.즉, 다음과 같이 사용할 수 있습니다. (1) 명령행에서 filename(2)이 아닌 modulename을 통해 python 코드를 실행합니다.sys.path에 사용하기 위해서importresolution 및 (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모듈명 자체에서 참조되는 모듈 외에 파일도 평가되었습니다.

「 」의 확장-mPEP 366이 부속되어 있습니다.이 업그레이드와 함께-m모듈을 실행할 때 절대 Import뿐만 아니라 명시적인 상대 Import도 지원할 수 있게 되었습니다.이것은 변경에 의해 달성되었습니다.-m ㅇㅇㅇㅇㅇ가 되고,__package__지정된 모듈명의 부모 모듈(이미 실행한 다른 모든 것 외에)에 대한 변수입니다.

사용 사례

에는, 다음의 2개의 중요한 사용 사례가 있습니다.-m 삭제:

  1. 명령줄에서 모듈의 파일 이름을 모를 수 있는 모듈을 실행합니다.이 사용 사례는 Python 인터프리터가 모듈 이름을 파일 이름으로 변환하는 방법을 알고 있다는 사실을 활용합니다.이는 명령줄에서 stdlib 모듈 또는 서드파티 모듈을 실행하는 경우에 특히 유용합니다.를 들어,만이 그 을 알고 .http.server모듈명을 알고 있기 때문에 명령줄에서 실행할 수 있습니다.python -m http.server.

  2. 절대 또는 상대 Import를 포함하는 로컬 패키지를 설치할 필요 없이 실행합니다.이 사용 사례는 PEP 338에 자세히 설명되어 있으며, 현재 작업 디렉토리가 에 추가되어 있다는 사실을 활용합니다.sys.path모듈 디렉토리가 아닌이 사용 사례는 다음과 같습니다.pip install -e .패키지를 개발/편집 모드로 설치합니다.

단점

모든 기능 강화로-m몇 년 동안 Python으로 작성된 모듈만 실행할 수 있다는 단점이 있습니다(즉,*.py예를 들어 다음과 같습니다.-mC 컴파일된 코드모듈 실행에 사용됩니다.다음 오류가 발생합니다.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패키지 모듈에 대해 평가되며 코드는 코드 모듈에 대해 평가됩니다.

결론

-mflag는 파일명이 아닌 모듈명을 사용하여 명령줄에서 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

반응형