-m 옵션을 사용하여 Python 코드 실행 여부
-m
플래그를 사용하십시오 .
스크립트가있는 경우 결과는 거의 동일하지만 -m
플래그 없이 패키지를 개발할 때 패키지 의 하위 패키지 또는 모듈을 기본 항목으로 실행하려는 경우 가져 오기가 올바르게 작동하도록 할 방법이 없습니다. 당신의 프로그램을 가리킨다 (그리고 나를 믿어 라, 나는 시도했다.)
문서
-m 플래그 의 문서 처럼 다음과 같이 말합니다.
sys.path에서 명명 된 모듈을 검색하고 해당 내용을 __main__
모듈 로 실행 합니다.
과
-c 옵션과 마찬가지로 현재 디렉토리가 sys.path의 시작 부분에 추가됩니다.
그래서
python -m pdb
대략 다음과 같습니다.
python /usr/lib/python3.5/pdb.py
(현재 디렉토리에 pdb.py라는 패키지 나 스크립트가 없다고 가정)
설명:
동작은 스크립트와 "고의적으로 유사"하게됩니다.
많은 표준 라이브러리 모듈에는 스크립트로 실행시 호출되는 코드가 포함되어 있습니다. 예는 timeit 모듈입니다.
일부 파이썬 코드는 모듈 로 실행되도록 의도되었습니다 : (이 예제가 명령 줄 옵션 문서 예제보다 낫다고 생각합니다)
$ python -m timeit '"-".join(str(n) for n in range(100))'
10000 loops, best of 3: 40.3 usec per loop
$ python -m timeit '"-".join([str(n) for n in range(100)])'
10000 loops, best of 3: 33.4 usec per loop
$ python -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 3: 25.2 usec per loop
그리고 Python 2.4의 릴리스 노트 하이라이트에서 :
-m 명령 줄 옵션-python -m modulename은 표준 라이브러리에서 모듈을 찾아 호출합니다. 예를 들어 다음과 python -m pdb
같습니다.python /usr/lib/python2.4/pdb.py
후속 질문
또한 David Beazley의 Python Essential Reference에서는 "-m 옵션은 라이브러리 모듈을 __main__
기본 스크립트 실행 전에 모듈 내부에서 실행되는 스크립트로 실행합니다 "라고 설명합니다.
이는 import 문으로 조회 할 수있는 모든 모듈이 프로그램의 진입 점으로 실행될 수 있음을 의미합니다. 일반적으로 끝에 코드 블록이있는 경우 if __name__ == '__main__':
.
-m
현재 디렉토리를 경로에 추가하지 않고 :
여기에 다른 의견은 다음과 같습니다.
-m 옵션이 현재 디렉토리를 sys.path에 추가한다는 것은 분명히 보안 문제입니다 (참조 : 사전로드 공격). 이 동작은 Windows의 라이브러리 검색 순서와 유사합니다 (최근에 강화되기 전). Python이 추세를 따르지 않고 .NET 추가를 비활성화하는 간단한 방법을 제공하지 않는 것은 유감입니다. sys.path에
음, 이것은 가능한 문제를 보여줍니다-(창에서 따옴표를 제거하십시오) :
echo "import sys; print(sys.version)" > pdb.py
python -m pdb
3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]
-I
플래그를 사용하여 프로덕션 환경에 대해이를 잠급니다 (버전 3.4의 새로운 기능).
python -Im pdb
usage: pdb.py [-c command] ... pyfile [arg] ...
etc...
에서 워드 프로세서 :
-I
격리 모드에서 Python을 실행합니다. 이것은 또한 -E 및 -s를 의미합니다. 격리 모드에서 sys.path에는 스크립트의 디렉토리 나 사용자의 사이트 패키지 디렉토리가 없습니다. 모든 PYTHON * 환경 변수도 무시됩니다. 사용자가 악성 코드를 삽입하는 것을 방지하기 위해 추가 제한이 적용될 수 있습니다.
무엇을 __package__
합니까?
이 질문과 특별히 연관되지는 않지만 명시적인 상대적 가져 오기를 가능하게합니다. 여기 답변을 참조하십시오. Python에서 "__package__"속성의 목적은 무엇입니까?
PYTHONPATH=test python -m foo.bar
은 무엇을 의미합니까? 자세히 설명해 주시겠습니까?