Виконання коду Python з опцією -m чи ні
Використовуйте -m
прапор.
Результати майже однакові, коли у вас є сценарій, але коли ви розробляєте пакет, без -m
прапора, немає ніякого способу змусити імпорт працювати належним чином, якщо ви хочете запустити субпакет або модуль у пакеті як основний запис вкажіть на вашу програму (і повірте, я спробував.)
Документи
Як і документи на прапорці -m :
Знайдіть sys.path для названого модуля та виконайте його вміст як __main__
модуль.
і
Як і у випадку -c, поточний каталог буде доданий до початку sys.path.
так
python -m pdb
приблизно еквівалентний
python /usr/lib/python3.5/pdb.py
(припустимо, що у вашому поточному каталозі під назвою pdb.py немає пакета чи сценарію)
Пояснення:
Поведінка робиться "навмисно схожим на" сценарії.
Багато стандартних модулів бібліотеки містять код, який викликається при їх виконанні як сценарій. Приклад - модуль timeit:
Деякий код python призначений для запуску як модуля: (я думаю, цей приклад кращий, ніж приклад параметра doc командного рядка)
$ 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 знайде модуль у стандартній бібліотеці та викликає його. Наприклад, python -m pdb
еквівалентноpython /usr/lib/python2.4/pdb.py
Подальше запитання
Крім того , Python Essential Reference Девід Бізлі пояснює його як «Опція -m запускає бібліотеку модуль як скрипт , який виконує всередині __main__
модуля до виконання основного сценарію».
Це означає, що будь-який модуль, який ви можете шукати за допомогою імпорту, може бути запущений як пункт входу програми - якщо він містить блок коду, як правило, наприкінці if __name__ == '__main__':
.
-m
без додавання поточного каталогу до шляху:
Коментар тут у іншому місці говорить:
Опція -m також додає поточний каталог в sys.path, очевидно, є проблемою безпеки (див.: Атака перед завантаженням). Така поведінка схожа на порядок пошуку бібліотеки в Windows (раніше, ніж вона була загартована). Шкода, що Python не дотримується тенденції та не пропонує простий спосіб відключити додавання. до sys.path
Ну, це демонструє можливу проблему - (у Windows видаліть лапки):
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__" в Python?
PYTHONPATH=test python -m foo.bar
? Чи можете ви пояснити це детально?