Инструменты командной строки для 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, чтобы избежать повторного создания.

Команды терминала для Python - comments

En
терминал python команды (python)