Wykonanie kodu Pythona z opcją -m lub bez
Użyj -m
flagi.
Wyniki są prawie takie same, gdy masz skrypt, ale kiedy tworzysz pakiet bez -m
flagi, nie ma sposobu, aby import działał poprawnie, jeśli chcesz uruchomić podpakiet lub moduł w pakiecie jako główny wpis wskaż swój program (i uwierz mi, próbowałem).
Dokumenty
Podobnie jak w dokumentach pod flagą -m :
Wyszukaj w sys.path nazwany moduł i wykonaj jego zawartość jako __main__
moduł.
i
Podobnie jak w przypadku opcji -c, bieżący katalog zostanie dodany na początku sys.path.
więc
python -m pdb
jest w przybliżeniu odpowiednikiem
python /usr/lib/python3.5/pdb.py
(zakładając, że nie masz pakietu lub skryptu w swoim bieżącym katalogu o nazwie pdb.py)
Wyjaśnienie:
Zachowanie jest „celowo podobne do” skryptów.
Wiele modułów bibliotek standardowych zawiera kod, który jest wywoływany podczas ich wykonywania jako skrypt. Przykładem jest moduł timeit:
Część kodu w Pythonie ma być uruchamiana jako moduł: (myślę, że ten przykład jest lepszy niż przykład w dokumencie z opcją wiersza poleceń)
$ 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
A z najważniejszych informacji o wydaniu dla Pythona 2.4 :
Opcja wiersza poleceń -m - python -m nazwa_modułu znajdzie moduł w bibliotece standardowej i wywoła go. Na przykład python -m pdb
jest równoważne zpython /usr/lib/python2.4/pdb.py
Pytanie uzupełniające
Również dokumentacja Python Essential Reference Davida Beazleya wyjaśnia to jako „Opcja -m uruchamia moduł biblioteki jako skrypt, który jest wykonywany wewnątrz __main__
modułu przed wykonaniem głównego skryptu”.
Oznacza to, że każdy moduł, który można wyszukać za pomocą instrukcji importu, może zostać uruchomiony jako punkt wejścia programu - jeśli ma blok kodu, zwykle pod koniec, z if __name__ == '__main__':
.
-m
bez dodawania bieżącego katalogu do ścieżki:
Komentarz tutaj w innym miejscu mówi:
To, że opcja -m dodaje również bieżący katalog do sys.path, jest oczywiście kwestią bezpieczeństwa (patrz: atak wstępnego ładowania). To zachowanie jest podobne do kolejności wyszukiwania w bibliotekach w systemie Windows (zanim została ostatnio ulepszona). Szkoda, że Python nie podąża za trendem i nie oferuje prostego sposobu na wyłączenie dodawania. do sys.path
Cóż, to pokazuje możliwy problem - (w Windows usuń cudzysłowy):
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)]
Użyj -I
flagi, aby zablokować to w środowiskach produkcyjnych (nowość w wersji 3.4):
python -Im pdb
usage: pdb.py [-c command] ... pyfile [arg] ...
etc...
z dokumentów :
-I
Uruchom Pythona w trybie izolowanym. To także implikuje -E i -s. W trybie izolowanym sys.path nie zawiera ani katalogu skryptu, ani katalogu pakietów witryn użytkownika. Wszystkie zmienne środowiskowe PYTHON * są również ignorowane. Mogą zostać nałożone dalsze ograniczenia, aby uniemożliwić użytkownikowi wstrzyknięcie złośliwego kodu.
Co robi __package__
?
Umożliwia to jawne importowanie względne, jednak niezbyt związane z tym pytaniem - zobacz odpowiedź tutaj: Jaki jest cel atrybutu „__package__” w Pythonie?
PYTHONPATH=test python -m foo.bar
? Czy mógłbyś to szczegółowo wyjaśnić?