Написание и запуск программ на 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% и сообщение. В случае ошибки соединения или отсутствия файла возникнет исключение, которое можно обработать дополнительно.