-m 옵션을 사용한 Python 코드 실행 여부
에는 가터파인썬이 있습니다.-m
"라이브러리 모듈을 스크립트로 실행"하는 module 옵션입니다.
이 파이썬 코드 a.py 을 사용하면:
if __name__ == "__main__":
print __package__
print __name__
테스트했습니다.python -m a
갖기 위해
"" <-- Empty String
__main__
에 반에면.python a.py
None <-- None
__main__
제가 보기에 이 두 호출은 -m 옵션으로 호출할 때 __package_가 None이 아닌 것을 제외하고는 동일한 것 같습니다.
미롭게와 함께, 와께함.python -m runpy a
저도 마찬가지입니다.python -m a
된 파이썬 합니다.pyc를 얻기 위해 컴파일된 파이썬 모듈을 사용합니다.
이 호출들 사이의 실질적인 차이는 무엇입니까?그들 사이에 장단점이 있습니까?
또한 David Beazley의 Python Essential Reference는 "-m 옵션은 메인 스크립트를 실행하기 전에 __main__ 모듈 내부에서 실행되는 스크립트로 라이브러리 모듈을 실행합니다."라고 설명합니다.그것은 무엇을 뜻하나요?
명령줄 플래그를 사용하면 Python에서 모듈 또는 패키지를 가져온 다음 스크립트로 실행합니다.사용하지 않을 때-m
플래그, 이름을 지정한 파일은 스크립트로 실행됩니다.
패키지를 실행할 때는 구분이 중요합니다.다음 항목 사이에는 큰 차이가 있습니다.
python foo/bar/baz.py
그리고.
python -m foo.bar.baz
로, 의후경우마찬지로가와자,,foo.bar
는 를가오가가올작바동다니합게르기져상과 함께 합니다.foo.bar
출발점으로
데모:
$ mkdir -p test/foo/bar
$ touch test/foo/__init__.py
$ touch test/foo/bar/__init__.py
$ cat << EOF > test/foo/bar/baz.py
> if __name__ == "__main__":
> print __package__
> print __name__
>
> EOF
$ PYTHONPATH=test python test/foo/bar/baz.py
None
__main__
$ PYTHONPATH=test python -m foo.bar.baz
foo.bar
__main__
로 패키지를 때을 써야 .-m
스위치를 켜다일반 스크립트는 절대 패키지가 될 수 없습니다.__package__
으로 설정됨None
.
그러나 패키지 내에서 패키지 또는 모듈 실행:-m
그리고 지금은 적어도 패키지의 가능성이 있습니다, 그래서.__package__
되며, 은 변는수문값설정됩니다로 설정됩니다. 위의 시연에서 변수는 다음과 같이 설정됩니다.'foo.bar'
패키지 내부에 없는 일반 모듈의 경우 빈 문자열로 설정됩니다.
에 __main__
모듈에서 Python은 일반 모듈을 가져올 때처럼 실행 중인 스크립트를 가져옵니다.글로벌 네임스페이스를 유지하기 위해 새 모듈 개체가 생성되고 저장됩니다.sys.modules['__main__']
이것이 바로 그것입니다.__name__
변수는 해당 구조의 키를 나타냅니다.
패키지의 경우 다음을 생성할 수 있습니다.__main__.py
를 할 때 .python -m package_name
실제로 이것이 패키지를 스크립트로 실행할 수 있는 유일한 방법입니다.
$ PYTHONPATH=test python -m foo.bar
python: No module named foo.bar.__main__; 'foo.bar' is a package and cannot be directly executed
$ cp test/foo/bar/baz.py test/foo/bar/__main__.py
$ PYTHONPATH=test python -m foo.bar
foo.bar
__main__
따서실행패할키로 이름을 할 때-m
은 Python 다음찾다니를 .__main__
모듈이 해당 패키지에 포함되어 있으며 스크립트로 실행됩니다.그러면 이름이 계속 다음으로 설정됩니다.'__main__'
그고모객여저있습다니어에 되어 있습니다.sys.modules['__main__']
.
-m 옵션을 사용한 Python 코드 실행 여부
을 합니다.-m
깃발
스크립트가 있을 때는 결과가 거의 동일하지만 패키지를 개발할 때는 그렇지 않습니다.-m
플래그, 패키지의 하위 패키지 또는 모듈을 프로그램의 주요 진입점으로 실행하려면 가져오기가 올바르게 작동하도록 할 방법이 없습니다(그리고 저를 믿으세요, 제가 노력했습니다).
문서
sys.path를 을 sys.path로 합니다.
__main__
모듈.
그리고.
-c 옵션과 마찬가지로 현재 디렉터리가 sys.path의 시작 부분에 추가됩니다.
그렇게
python -m pdb
와 거의 동등합니다.
python /usr/lib/python3.5/pdb.py
(현재 디렉토리에 pdb.py 이라는 패키지나 스크립트가 없는 경우)
설명:
동작은 스크립트와 "의도적으로 유사하게" 만들어집니다.
대부분의 표준 라이브러리 모듈에는 스크립트로 실행할 때 호출되는 코드가 포함되어 있습니다.예를 들어 time it 모듈은 다음과 같습니다.
일부 파이썬 코드는 모듈로 실행하기 위한 것입니다. (이 예제가 명령줄 옵션 문서 예제보다 더 낫다고 생각합니다.)
$ 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
-m 명령줄 옵션 - python -m 모듈 이름은 표준 라이브러리에서 모듈을 찾아 호출합니다.를 들면, 들면를예,
python -m pdb
는 와동합다니등다에 합니다.python /usr/lib/python2.4/pdb.py
후속 질문
는 "-m 옵션은 모듈을 하여 "David Beazley" Python Essential Reference " " "을 실행합니다.
__main__
기본 스크립트를 실행하기 전에 모듈을 사용해야 합니다."
할 수 될 수 있음을 합니다. 블록이 에는 가기은 문이조 -약가있블코지드고면록다을근에끝처일로그으적것반실수행만있이것될것는다의로을다미니합으는듈든로져이입있점모그모오프램의으회진수로할▁you,▁can▁it▁block▁any▁-▁means▁code▁the▁be▁it▁module▁an▁a▁if▁with▁program▁statement▁can▁with▁as▁import,▁end▁lookup▁has▁near있가▁run▁point▁of이블코지,것고if __name__ == '__main__':
.
-m
경로에 현재 디렉터리를 추가하지 않고:
여기 다른 곳에 있는 댓글은 다음과 같습니다.
-m 옵션이 현재 디렉터리를 sys.path에 추가하는 것은 분명히 보안 문제입니다(예: 프리로드 공격 참조).이 동작은 최근에 강화되기 전의 Windows(윈도우)의 라이브러리 검색 순서와 유사합니다.Python이 추세를 따르지 않고 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__
하십니까?
그러나 명시적인 상대적 가져오기를 가능하게 합니다. 특히 이 질문과 관련된 것은 아닙니다. 여기에서 다음 답변을 참조하십시오.파이썬에서 "__package__" 속성의 목적은 무엇입니까?
-m을 사용하여 모듈(또는 패키지)을 스크립트로 실행하는 주요 이유는 특히 Windows에서 배포를 단순화하기 위한 것입니다.PATH 또는 ~/.local과 같은 글로벌 실행 파일 디렉터리를 오염시키는 대신 모듈이 일반적으로 이동하는 Python 라이브러리의 동일한 위치에 스크립트를 설치할 수 있습니다(Windows에서는 사용자별 스크립트 디렉터리를 찾기가 터무니없이 어렵습니다).
그런 다음 -m을 입력하면 Python이 자동으로 스크립트를 찾습니다.를 들면, 들면를예,python -m pip
이를 실행하는 동일한 Python 인터프리터 인스턴스에 대한 올바른 pip를 찾습니다.하지 않고 버전을 "" pip?-m이 다면없, 사글이여설면다, 어떤것 "이벌로" ?
사용자가 명령줄 스크립트에 대해 "확장" 진입점을 선호하는 경우 이러한 진입점을 PATH의 어딘가에 작은 스크립트로 쉽게 추가하거나, pip이 setup.py 의 entry_points 매개 변수를 사용하여 설치 시 이러한 진입점을 만들 수 있습니다.
그러니 확인해 보세요.__name__ == '__main__'
그리고 기타 중요하지 않은 구현 세부 정보는 무시합니다.
언급URL : https://stackoverflow.com/questions/22241420/execution-of-python-code-with-m-option-or-not
'programing' 카테고리의 다른 글
마우스 클릭 없이 Excel에서 하이퍼링크를 여는 방법, 바로 가기 키/키가 있습니까? (0) | 2023.06.10 |
---|---|
ND에서 1D 어레이까지 (0) | 2023.06.10 |
Wordpress wp_schedule_event 랜덤 30분에서 60분 사이 (0) | 2023.06.10 |
Python에서 파일 잠금 (0) | 2023.06.10 |
오라클 AQ에서 대기열을 지우는 방법 (0) | 2023.06.10 |