Написание и запуск программ на Python: подробное руководство

Раздел: Разработка на Python -> Запуск Python кода

Основные подходы к созданию скрипта на Python

Разработка скрипта начинается с выбора редактора и написания кода, затем следует его запуск. В этой статье рассмотрены различные способы создания скрипта, от простейшего до структурированного с обработкой аргументов и зависимостей. Для каждого варианта приведены цели использования и типичные ошибки.

Как создать надежный скрипт с точкой входа и обработкой ошибок?

Наиболее эффективный способ организации Python скрипта заключается в использовании функции main() и защищенного запуска через конструкцию if __name__ == "__main__". Это позволяет повторно использовать код скрипта как модуль, не выполняя его при импорте. Такой подход облегчает тестирование и поддержку.

#!/usr/bin/env python3
# example_script.py
import sys
import logging

logging.basicConfig(level=logging.INFO)

def main():
    args = sys.argv[1:]
    if not args:
        logging.error("Не указаны аргументы")
        sys.exit(1)
    logging.info("Запуск с аргументами: %s", args)
    # основная логика

if __name__ == "__main__":
    main()

Python выполнить функцию (выполнение функции в python)

Цель: создание скрипта, готового к использованию как в командной строке, так и в качестве модуля. Случаи использования: любые утилиты, которые должны быть расширяемыми.

Типичные ошибки: забыть вызов sys.exit() при ошибках, неправильное использование условия __name__. Решение: всегда завершать скрипт с кодом возврата и проверять, что точка входа изолирована.

Как написать простейший скрипт 'Hello, World!'?

print("Hello, World!")

как сделать скрипт python (создание скрипта python)

Достаточно сохранить эту строку в файл с расширением .py (например, hello.py) и запустить командой python hello.py. Цель: быстрая проверка работоспособности Python. Случаи использования: первое знакомство с языком, тестирование окружения.

Проблема: если Python не установлен или отсутствует в PATH, возникнет ошибка. Решение: установить Python и добавить в переменные окружения.

Как сделать скрипт исполняемым в Unix?

#!/usr/bin/env python3
print("Executable script")

После добавления shebang (первая строка) и установки прав на выполнение командой chmod +x script.py скрипт можно запускать как ./script.py. Цель: удобство запуска без явного вызова интерпретатора. Случаи использования: системные утилиты, развертывание в Linux/macOS.

Проблема: shebang может указывать на неверный путь к интерпретатору. Решение: использовать #!/usr/bin/env python3 для автоматического поиска.

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

import sys
if len(sys.argv) < 2:
    print("Usage: script.py ")
    sys.exit(1)
print("Hello,", sys.argv[1])

Использование списка sys.argv позволяет обрабатывать позиционные аргументы. Цель: простой сбор входных данных. Случаи использования: скрипты с одним-двумя параметрами, где не нужен сложный разбор.

Проблема: легко допустить ошибки индексации, нет поддержки флагов. Решение: для сложных интерфейсов перейти на argparse.

Как создать профессиональный интерфейс командной строки с argparse?

import argparse
parser = argparse.ArgumentParser(description="Пример CLI")
parser.add_argument("--name", required=True, help="Имя пользователя")
parser.add_argument("--greeting", default="Hello", help="Приветствие")
args = parser.parse_args()
print(f"{args.greeting}, {args.name}!")

Модуль argparse автоматически генерирует справку, поддерживает флаги, значения по умолчанию. Цель: создание интуитивного интерфейса для сложных скриптов. Случаи использования: любые утилиты, где требуется несколько опций.

Проблема: неправильное указание типа аргументов или обязательности. Решение: использовать --help и проверять парсинг.

Как изолировать зависимости скрипта с помощью виртуального окружения?

# Создание окружения
python3 -m venv myenv
source myenv/bin/activate  # Linux/macOS
# myenv\Scripts\activate  # Windows
pip install requests
python my_script.py

Виртуальное окружение позволяет установить библиотеки изолированно от системы. Цель: предотвращение конфликтов версий, чистое окружение проекта. Случаи использования: разработка с внешними пакетами, совместная работа.

Проблема: забыть активировать окружение и использовать глобальный интерпретатор. Решение: явно указывать путь к интерпретатору в venv или использовать активацию в IDE.

Расширенные примеры скриптов на Python

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

Пример 1: Скрипт поиска дубликатов файлов

Этот скрипт обходит заданную директорию, находит файлы с одинаковым содержимым (по SHA256 хешу) и выводит их пути. Используются модули os, hashlib, argparse.

Пример
#!/usr/bin/env python3
import os
import hashlib
import argparse

def file_hash(filepath):
    h = hashlib.sha256()
    with open(filepath, 'rb') as f:
        for chunk in iter(lambda: f.read(65536), b''):
            h.update(chunk)
    return h.hexdigest()

def find_duplicates(directory):
    sizes = {}
    for dirpath, _, filenames in os.walk(directory):
        for f in filenames:
            fp = os.path.join(dirpath, f)
            try:
                size = os.path.getsize(fp)
                sizes.setdefault(size, []).append(fp)
            except OSError:
                pass
    duplicates = {}
    for size, files in sizes.items():
        if len(files) > 1:
            hashes = {}
            for fp in files:
                h = file_hash(fp)
                hashes.setdefault(h, []).append(fp)
            for h, fps in hashes.items():
                if len(fps) > 1:
                    duplicates.update({h: fps})
    return duplicates

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Поиск дубликатов файлов')
    parser.add_argument('directory', help='Директория для сканирования')
    args = parser.parse_args()
    dups = find_duplicates(args.directory)
    for h, files in dups.items():
        print(f'Хеш: {h}')
        for f in files:
            print(f'  {f}')

Результат работы (пример):

$ python duplicates.py /tmp/test
Хеш: a1b2c3d4e5f6...
  /tmp/test/file1.txt
  /tmp/test/backup/file1.txt
Хеш: 0987654321ab...
  /tmp/test/photo.jpg
  /tmp/test/copy_photo.jpg

Для ускорения сначала сравниваются размеры, а только потом хеши. Скрипт использует потоковое чтение, что позволяет обрабатывать большие файлы.

Пример 2: Скрипт конвертации CSV в JSON

Преобразует файл CSV с заголовками в формат JSON. Поддерживает указание разделителя. Используются модули csv, json, sys.

Пример
#!/usr/bin/env python3
import csv
import json
import sys

def csv_to_json(csv_file, json_file, delimiter=','):
    data = []
    with open(csv_file, newline='', encoding='utf-8') as f:
        reader = csv.DictReader(f, delimiter=delimiter)
        for row in reader:
            data.append(row)
    with open(json_file, 'w', encoding='utf-8') as out:
        json.dump(data, out, indent=4, ensure_ascii=False)
    print(f'Преобразовано {len(data)} строк в {json_file}')

if __name__ == '__main__':
    if len(sys.argv) < 3:
        print("Использование: csv2json.py   [delimiter]")
        sys.exit(1)
    delim = sys.argv[3] if len(sys.argv) > 3 else ','
    csv_to_json(sys.argv[1], sys.argv[2], delim)

Результат работы:

$ python csv2json.py data.csv output.json
Преобразовано 10 строк в output.json
$ head -20 output.json
[
    {
        "Name": "Alice",
        "Age": "30",
        "City": "Moscow"
    },
    {
        "Name": "Bob",
        "Age": "25",
        "City": "Saint Petersburg"
    },
    ...
]

Скрипт автоматически обрабатывает кодировку UTF-8 и сохраняет не-ASCII символы. При необходимости можно добавить поддержку разных разделителей и экранирования.

Пример 3: Скрипт для скачивания файлов с индикатором прогресса

Использует модуль urllib.request для загрузки файла по URL с выводом прогресса в консоль. Реализован подсчет и отображение процентов. Для асинхронности можно использовать asyncio, но здесь показан синхронный вариант с ручным прогрессом.

Пример
#!/usr/bin/env python3
import urllib.request
import sys
import os

def download_file(url, filename):
    def report(block_num, block_size, total_size):
        downloaded = block_num * block_size
        if total_size > 0:
            percent = min(100, int(downloaded * 100 / total_size))
            sys.stdout.write(f'\rЗагружено: {percent}%')
            sys.stdout.flush()
    urllib.request.urlretrieve(url, filename, reporthook=report)
    print('\nЗагрузка завершена.')

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('Использование: download.py  [filename]')
        sys.exit(1)
    url = sys.argv[1]
    filename = sys.argv[2] if len(sys.argv) > 2 else os.path.basename(url)
    download_file(url, filename)

Результат (вывод в процессе):

$ python download.py https://example.com/file.zip
Загружено: 45%

После завершения прогресс покажет 100% и сообщение. В случае ошибки соединения или отсутствия файла возникнет исключение, которое можно обработать дополнительно.

Создание скрипта Python - comments

En
как сделать скрипт python (python)