Инструменты командной строки для Python
Основы работы с Python в командной строке
Наиболее эффективный подход к управлению проектами на Python включает создание изолированного виртуального окружения и передачу аргументов через argparse. Это позволяет избежать конфликтов пакетов и сделать скрипты гибкими.
Создание окружения:
python -m venv my_project_envтерминал python команды (команды терминала для python)
Активация (на Unix-подобных системах):
source my_project_env/bin/activate
Установка зависимостей:
pip install -r requirements.txt
Запуск скрипта с аргументами:
python script.py --input data.csv --output result.json
Такой подход гарантирует воспроизводимость и упрощает развертывание. При возникновении ошибки ModuleNotFoundError следует проверить активацию окружения и наличие файла requirements.txt.
Ошибка: pip: command not found - возникает, если Python не добавлен в PATH. Решение: переустановить Python с опцией добавления в PATH или использовать python -m pip.
Как выполнить простой скрипт Python?
Самый базовый способ - передать имя файла интерпретатору:
python hello.py
Если файл содержит шебанг и права на исполнение, можно запустить напрямую:
./hello.py
Для этого в первой строке файла указывается:
#!/usr/bin/env python3
Проблема: Permission denied - решается командой chmod +x hello.py.
Если используется Windows, шебанг не работает, и требуется явный вызов python.
Как передать аргументы в скрипт?
Аргументы командной строки доступны через sys.argv. Простой пример:
python arg_demo.py --name World --count 3
Код arg_demo.py:
import sys
print('Аргументы:', sys.argv)
Результат:
Аргументы: ['arg_demo.py', '--name', 'World', '--count', '3']
Для более сложной обработки используется модуль argparse. Пример:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--input', required=True)
parser.add_argument('--output', default='out.txt')
args = parser.parse_args()
print(args.input, args.output)
Запуск:
python argparse_demo.py --input data.txt
Результат:
data.txt out.txt
Ошибка: argument --input is required - если забыть указать обязательный аргумент.
Как использовать интерактивный режим Python?
Запуск интерпретатора без аргументов открывает интерактивную оболочку:
python
В ней можно выполнять код построчно. Для выхода используется exit() или Ctrl+D (Unix) / Ctrl+Z (Windows).
Интерактивный режим после выполнения скрипта запускается с флагом -i:
python -i script.py
После завершения скрипта сессия остаётся открытой, что полезно для отладки.
Если интерактивная оболочка не запускается, проверьте, установлен ли Python и доступен ли он через PATH.
Как запустить модуль как скрипт (флаг -m)?
Флаг -m позволяет интерпретатору найти модуль в стандартных путях и выполнить его как главный скрипт. Это удобно для встроенных модулей или пакетов, установленных через pip.
Пример - запуск встроенного HTTP-сервера:
python -m http.server 8080
Сервер раздаёт файлы текущей директории по адресу http://localhost:8080.
Другой пример - форматирование JSON:
echo '{"name":"John"}' | python -m json.tool
Результат:
{
"name": "John"
}
Так же можно запустить pdb (отладчик) или cProfile (профилировщик).
Ошибка: No module named X - модуль не установлен. Решение: установить через pip install X.
Как управлять пакетами с помощью pip?
Менеджер пакетов pip - стандартный инструмент для установки библиотек. Основные команды:
pip install requests
pip install numpy==1.21.0
pip install -r requirements.txt
Просмотр установленных пакетов:
pip list
pip freeze
Команда pip freeze выводит версии в формате, пригодном для requirements.txt.
Удаление:
pip uninstall requests
Проблема: Permission denied при установке глобально. Решение: использовать виртуальное окружение или флаг --user: pip install --user requests.
На Windows может потребоваться запуск от имени администратора.
Как создать и использовать виртуальное окружение?
Виртуальное окружение изолирует зависимости проекта. Создание:
python -m venv myenv
Активация (Unix):
source myenv/bin/activate
Активация (Windows CMD):
myenv\Scripts\activate
После активации все команды python и pip работают внутри окружения. Деактивация:
deactivate
Для указания конкретной версии Python используется:
python3.10 -m venv myenv
Ошибка: venv: command not found - модуль не доступен. На некоторых системах нужно установить пакет python3-venv через системный менеджер пакетов (например, apt).
Как выполнить однострочный код Python (флаг -c)?
Флаг -c позволяет передать код в виде строки. Полезно для быстрых вычислений или тестов:
python -c "print(2**10)"
Результат:
1024
Можно импортировать модули:
python -c "import math; print(math.pi)"
Результат:
3.141592653589793
Если код содержит кавычки, на Windows могут возникнуть сложности с экранированием. Рекомендуется использовать двойные кавычки для внешнего и одинарные для внутреннего кода.
Как отлаживать скрипты с помощью pdb?
Отладчик pdb позволяет пошагово выполнять код. Запуск:
python -m pdb script.py
Внутри отладчика доступны команды: n (next), s (step into), c (continue), q (quit).
Можно добавить точку остановки в коде:
import pdb; pdb.set_trace()
После этого выполнение остановится в указанном месте.
Если отладчик не запускается, проверьте корректность синтаксиса скрипта.
Как профилировать выполнение скрипта?
Модуль cProfile показывает, сколько времени занимает каждая функция. Запуск:
python -m cProfile -s cumulative script.py
Вывод сортируется по суммарному времени. Пример результата:
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.001 0.001 script.py:2(<module>)
1 0.001 0.001 0.001 0.001 {built-in method builtins.print}
Для анализа можно сохранить результат в файл:
python -m cProfile -o profile.stats script.py
python -m pstats profile.stats
Профилирование увеличивает время выполнения, поэтому не стоит использовать его в продакшне.
Как проверить синтаксис скрипта без выполнения?
Модуль py_compile компилирует файл и сообщает об ошибках синтаксиса:
python -m py_compile script.py
Если ошибок нет, команда завершается без вывода. При наличии ошибок выводится сообщение, например:
SyntaxError: invalid syntax (script.py, line 3)
Также можно использовать флаг -c с compile, но py_compile удобнее для отдельных файлов.
Модуль py_compile не проверяет зависимости или логические ошибки.
Как управлять байт-кодом и оптимизациями?
Python по умолчанию создаёт кэш байт-кода в папке __pycache__. Флаг -B отключает это поведение:
python -B script.py
Флаг -OO включает оптимизацию (удаляет assert и docstrings):
python -OO script.py
Это может уменьшить размер и незначительно ускорить выполнение, но делает отладку сложнее.
При использовании -OO исчезают строки документации, что может сломать код, который на них полагается.
Как изменить путь поиска модулей (PYTHONPATH)?
Переменная окружения PYTHONPATH добавляет директории в sys.path. Запуск с её установкой:
PYTHONPATH=/home/user/mylibs python script.py
На Windows:
set PYTHONPATH=C:\path\to\libs && python script.py
Это полезно для использования локальных библиотек без установки.
Если путь указан неверно, импорт модуля завершится ошибкой ModuleNotFoundError.
Расширенные примеры работы с Python в командной строке
Использование argparse с подкомандами (subparsers):
import argparse
parser = argparse.ArgumentParser(prog='tool')
sub = parser.add_subparsers(dest='command')
hello = sub.add_parser('hello')
hello.add_argument('--name')
goodbye = sub.add_parser('goodbye')
goodbye.add_argument('--name')
args = parser.parse_args()
if args.command == 'hello':
print(f'Hello {args.name}')
elif args.command == 'goodbye':
print(f'Goodbye {args.name}')
Запуск:
python tool.py hello --name Alice
Результат:
Hello Alice
Установка пакетов из файла с версиями и дополнительными индексами:
pip install -r requirements.txt --index-url https://private.pypi.org/simple/ --extra-index-url https://pypi.org/simple
Файл requirements.txt может содержать:
requests==2.28.1 numpy>=1.21 # это комментарий ./local_package
Запуск скрипта с разными версиями Python через shebang:
#!/usr/bin/env python3.10
print(f"Python version: {sys.version}")
После chmod +x скрипт запускается командой:
./version_demo.py
Результат:
Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
Быстрая отладка с помощью интерактивного режима после выполнения:
python -i -c " x = 10 y = 20 print(x + y) "
После вывода 30 сессия остаётся открытой. Можно проверить значения переменных:
>>> x 10 >>> y 20
Выход - exit().
Использование PYTHONSTARTUP для автозагрузки кода в интерактивной сессии:
# Файл ~/.pythonrc.py
import atexit
import readline
import rlcompleter
readline.parse_and_bind('tab: complete')
history_file = os.path.expanduser('~/.python_history')
def save_history():
readline.write_history_file(history_file)
if os.path.exists(history_file):
readline.read_history_file(history_file)
atexit.register(save_history)
print("Startup loaded")
Запуск с переменной:
PYTHONSTARTUP=~/.pythonrc.py python
Теперь в интерактивной оболочке работает автодополнение по Tab и история команд сохраняется между сессиями.
Профилирование с сортировкой по времени в собственном формате:
python -m cProfile -s tottime myscript.py
Сохранение статистики для последующего анализа:
python -m cProfile -o stats.prof myscript.py python -m pstats stats.prof
В интерактивном режиме pstats доступны команды sort, stats, help.
Встроенный HTTP-сервер с привязкой к определённому IP:
python -m http.server 8000 --bind 127.0.0.1
Доступен только локально. Для публичного доступа используется --bind 0.0.0.0 (осторожно, безопасность!).
Парсинг и форматирование JSON из файла:
python -m json.tool data.json > formatted.json
Если нужно отсортировать ключи:
python -c "import json,sys; print(json.dumps(json.load(sys.stdin), sort_keys=True, indent=2))" < data.json
Результат - отформатированный JSON с сортировкой ключей.
Запуск скрипта с отключением создания __pycache__ и оптимизацией:
python -B -OO script.py
Размер кэша уменьшается, assert и docstrings не выполняются. Проверить отсутствие docstrings:
python -c "def f(): 'doc'; pass; print(f.__doc__)"
Результат (без -OO): doc. С -OO: None.
Использование переменной PYTHONUNBUFFERED для немедленного вывода:
PYTHONUNBUFFERED=1 python script.py
Полезно при перенаправлении вывода в лог, чтобы избежать задержек.
Команда для рекурсивного поиска .pyc файлов и их удаления:
find . -name '*.pyc' -delete
# или
find . -type d -name '__pycache__' -exec rm -rf {} +
После этого можно запустить Python с флагом -B, чтобы избежать повторного создания.