Запуск программ через командную строку Python

Как запустить программу через командную строку python

Как запустить программу через командную строку python

Важно учитывать различия между платформами: пути к исполняемым файлам и форматы команд могут отличаться на Windows и Linux. Использование функции shlex.split() помогает корректно разбирать команды с пробелами и кавычками, обеспечивая переносимость скриптов без изменения их логики.

Использование модуля subprocess для запуска внешних приложений

Использование модуля subprocess для запуска внешних приложений

Для простого запуска программы и получения её результата используется функция subprocess.run(). Она принимает список аргументов, где первый элемент – имя исполняемого файла, последующие – параметры командной строки. Пример:

result = subprocess.run(['ping', '-c', '4', 'example.com'], capture_output=True, text=True)

Для передачи данных во внешний процесс используется параметр input. Пример взаимодействия с утилитой, ожидающей ввод пользователя:

process = subprocess.run(['grep', 'pattern'], input='строка для поиска', capture_output=True, text=True)

Если требуется параллельная работа с процессом, применяется Popen:

proc = subprocess.Popen(['long_running_task'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Для контроля времени выполнения применяется параметр timeout в run() или communicate(timeout=секунды). При превышении времени вызывается исключение subprocess.TimeoutExpired, что позволяет корректно завершать зависшие процессы.

Передача аргументов в виде списка предпочтительнее строки, так как исключает ошибки при наличии пробелов или специальных символов в путях и именах файлов. Для запуска shell-команд с интерпретацией оболочки используется shell=True, однако это увеличивает риск инъекций команд, поэтому применять следует только с доверенными данными.

Передача аргументов командной строки в Python-скрипты

Передача аргументов командной строки в Python-скрипты

Для обработки аргументов командной строки в Python используется модуль sys. Значения переданные скрипту доступны через список sys.argv, где sys.argv[0] – имя скрипта, а последующие элементы – аргументы.

Пример использования: python script.py input.txt 10. В коде: import sys; filename = sys.argv[1]; count = int(sys.argv[2]).

Для сложной обработки рекомендуется использовать модуль argparse. Он позволяет задать типы аргументов, обязательность и описание. Пример:

import argparse

parser = argparse.ArgumentParser(description='Обработка файлов')

parser.add_argument('file', type=str, help='Имя файла')

parser.add_argument('--lines', type=int, default=5, help='Количество строк')

args = parser.parse_args()

print(args.file, args.lines)

Использование argparse обеспечивает проверку типов и генерацию справки python script.py -h.

При интеграции с оболочками Unix полезно применять кавычки для аргументов с пробелами: python script.py "My File.txt".

Аргументы можно комбинировать: позиционные, опциональные и флаги. Позиционные аргументы обязательны, опциональные имеют префикс -- и могут иметь значения по умолчанию.

Пример базовой реализации:

import subprocess
process = subprocess.Popen(
['ping', '8.8.8.8', '-n', '5'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
for line in process.stdout:

Рекомендации для стабильного считывания:

  • Использовать text=True или universal_newlines=True для получения строк вместо байтов.
  • Считывать stdout построчно в цикле for line in process.stdout, чтобы избежать блокировок.
  • При необходимости отслеживать ошибки одновременно, можно применять select на UNIX или отдельный поток для stderr.

Пример чтения stdout и stderr одновременно с потоками:

import subprocess
import threading
def read_stream(stream):
for line in iter(stream.readline, ''):
print(line, end='')
process = subprocess.Popen(
['python', 'long_task.py'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
bufsize=1
)
threading.Thread(target=read_stream, args=(process.stdout,)).start()
threading.Thread(target=read_stream, args=(process.stderr,)).start()
process.wait()

Советы по производительности и надежности:

  • Не использовать process.communicate() для потокового чтения, так как он блокирует до завершения процесса.
  • Для критически больших данных рассматривать subprocess.PIPE в комбинации с asyncio для асинхронной обработки.
  • Проверять код возврата через process.returncode после wait() для диагностики завершения.

Обработка ошибок и кодов возврата при запуске процессов

Обработка ошибок и кодов возврата при запуске процессов

Для перехвата исключений применяют subprocess.run() с параметром check=True. При ненулевом коде возврата возникает subprocess.CalledProcessError, содержащий атрибуты returncode и cmd. Это позволяет логировать сбои и выполнять корректные действия по восстановлению.

Важно различать ошибки самого процесса и системные ошибки запуска. FileNotFoundError возникает, если указанный исполняемый файл отсутствует, PermissionError – при недостатке прав. Эти исключения обрабатываются отдельными блоками try-except для точной диагностики.

Для асинхронного контроля процессов используется subprocess.Popen. Метод poll() позволяет проверить завершение процесса без блокировки, а wait() возвращает код возврата после завершения. Проверка кода возврата после wait() гарантирует обработку ошибок, даже если процесс завершился вне run().

При сложных сценариях рекомендуется сохранять stdout и stderr через PIPE. Это дает возможность анализировать текст ошибок и принимать решение о повторном запуске, уведомлении пользователя или корректировке аргументов запуска.

Пример проверки кода возврата с логированием:

import subprocess
try:
  result = subprocess.run(['my_program', '--option'], check=True, capture_output=True, text=True)
  print(result.stdout)
except subprocess.CalledProcessError as e:
  print(f'Ошибка процесса {e.cmd}, код возврата {e.returncode}')
except FileNotFoundError:
  print('Файл не найден')
except PermissionError:
  print('Недостаточно прав для запуска')

Такой подход обеспечивает точное различение причин сбоев и предотвращает скрытые ошибки при автоматизированных запусках процессов. Контроль кода возврата и исключений позволяет строить стабильные цепочки выполнения внешних программ в Python.

Запуск программ асинхронно и управление несколькими процессами

Запуск программ асинхронно и управление несколькими процессами

Для асинхронного запуска внешних программ в Python используется модуль asyncio совместно с subprocess. Основной подход – создание корутин, которые запускают процессы и отслеживают их завершение без блокировки основного потока.

Пример асинхронного запуска процесса:

import asyncio
async def run_program(cmd):
  process = await asyncio.create_subprocess_shell(cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE)
  stdout, stderr = await process.communicate()
  return process.returncode, stdout.decode(), stderr.decode()

async def main():
  tasks = [run_program('ping -c 3 example.com'), run_program('ls -la')]
  results = await asyncio.gather(*tasks)
  for code, out, err in results:

asyncio.run(main())

Для управления множественными процессами эффективно использовать asyncio.gather или asyncio.create_task, что позволяет параллельно запускать десятки процессов без необходимости создавать отдельные потоки вручную.

Если требуется ограничение числа одновременно работающих процессов, применяют asyncio.Semaphore:

sem = asyncio.Semaphore(5) # максимум 5 процессов одновременно
async def limited_run(cmd):
  async with sem:
    return await run_program(cmd)

Для мониторинга и управления процессами на лету можно проверять process.returncode, завершать процессы через process.terminate() или process.kill(). Такой подход позволяет строить гибкие пайплайны, распределять задачи и обрабатывать ошибки конкретного процесса без остановки всей программы.

При работе с большим количеством процессов рекомендуется хранить результаты выполнения в структуре типа словаря или списка с идентификаторами команд, что упрощает последующую агрегацию данных и обработку ошибок.

Работа с путями и окружением при вызове внешних программ

Работа с путями и окружением при вызове внешних программ

Пример запуска с указанием полного пути:

subprocess.run(["C:\\Program Files\\App\\app.exe", "arg1"], check=True)

Для динамического формирования пути можно использовать os.path.join и os.path.abspath, что обеспечивает корректность разделителей и независимость от операционной системы.

Управление переменными окружения осуществляется через параметр env. Это позволяет запускать программу с изменённым PATH или другими переменными без изменения глобального окружения процесса Python.

Пример передачи модифицированного окружения:

import os, subprocess

env = os.environ.copy()

env[«PATH»] = «C:\\Tools;» + env[«PATH»]

subprocess.run([«tool.exe»], env=env)

Таблица демонстрирует основные рекомендации по работе с путями и окружением:

Задача Рекомендация Пример
Абсолютный путь к программе Использовать os.path.abspath или явно указать путь "C:\\Program Files\\App\\app.exe"
Относительный путь Приводить к абсолютному перед запуском os.path.abspath("scripts\\run.bat")
Переменные окружения Копировать os.environ и модифицировать только необходимые ключи env = os.environ.copy(); env["PATH"] = new_path
Платформенная независимость Использовать os.path.join для конструирования путей os.path.join("dir", "subdir", "file.exe")
Проверка существования Перед запуском убедиться, что файл существует os.path.exists(path_to_exe)

Следование этим правилам минимизирует ошибки при запуске внешних программ, особенно на системах с нестандартными путями или ограниченными правами доступа.

Вопрос-ответ:

Как запустить Python-скрипт через командную строку?

Для запуска скрипта откройте командную строку, перейдите в папку с файлом через команду cd и выполните команду python имя_файла.py. На Windows можно использовать python или py, на Linux и macOS — python3. Если файл использует библиотеки, убедитесь, что они установлены в текущей среде.

Можно ли передавать аргументы в скрипт через командную строку?

Да, Python позволяет передавать аргументы при запуске. Например, командой python скрипт.py арг1 арг2 вы передаете значения. Внутри скрипта их можно получить через модуль sys: список sys.argv содержит имя файла и все переданные параметры. Это удобно для настройки поведения программы без изменения кода.

Как проверить версию Python из командной строки?

Чтобы узнать установленную версию Python, достаточно ввести python —version или python3 —version. На Windows иногда работает команда py —version. Это позволяет убедиться, что используется нужная версия интерпретатора перед запуском скриптов.

Что делать, если при запуске скрипта выходит ошибка «python не является внутренней или внешней командой»?

Ошибка появляется, когда командная строка не находит исполняемый файл Python. Нужно проверить, что Python установлен и путь к папке с python.exe добавлен в системную переменную PATH. После этого закрываем и открываем командную строку заново, чтобы изменения вступили в силу, и повторяем запуск скрипта.

Можно ли запускать скрипты в фоновом режиме через командную строку?

Да, на Windows можно использовать команду start python скрипт.py, а на Linux/macOS — python3 скрипт.py &. Знак & запускает процесс в фоне. Это удобно, если нужно, чтобы программа работала без блокировки терминала, но следует учитывать, что вывод программы может быть не виден без перенаправления в файл.

Ссылка на основную публикацию