Python Materials For Beginners
446 subscribers
39 photos
1 video
9 files
150 links
Download Telegram
🔴 Exit code

Повернемось до теми Корисні речі, які варто знати про процес

Код завершення процесу (exit code, return code) — це числове значення, яке процес повертає операційній системі після свого завершення.

Воно показує, як саме процес завершився:

0️⃣ 0 — успішне виконання без помилок;
1️⃣ Будь-яке ненульове значення, вказує на помилку або особливу причину завершення, залежно від програми.

Код завершення використовується іншими процесами, скриптами чи системами автоматизації (наприклад, bash, make, systemd) для визначення, чи потрібно вважати виконання команди успішним або повторити/обробити помилку.

У Linux перевірити exit code останньої команди можна через змінну $?.
У Windows щоб отримати код завершення останньої команди, використовують змінну %ERRORLEVEL%.

Для прикладу розглянемо код
import sys

def main() -> int:
if len(sys.argv) != 3:
print("Usage: python script.py <num1> <num2>", file=sys.stderr)
return 1
try:
a = float(sys.argv[1])
b = float(sys.argv[2])
print(a / b)
return 0
except ValueError:
print("Error: arguments must be numbers", file=sys.stderr)
return 2
except ZeroDivisionError:
print("Error: division by zero", file=sys.stderr)
return 3

if __name__ == "__main__":
sys.exit(main())

sys.exit() задає код завершення процесу, для помилок ми використали значення 1,2,3

Запустимо наш код у командному рядку:

Linux
python3 main.py 1 0
echo $?

Windows
python main.py 1 0
echo %ERRORLEVEL%

Команда echo виведе нам код з яким завершився процес.
Так як відбувається ділення на 0 — код завершення буде 3.
Інший процес або скрипт може легко дізнатись код завершення і прийняти відповідне рішення.
1👍1
Git. Ситуація: Створили репозиторій.Є файл A.txt. Виконали: git add A.txt

Потрібно прибрати A.txt зі staging, не видаляючи файл з диска і не змінюючи його вміст. Що можна виконати? (декілька варіантів)
Anonymous Poll
16%
git restore A.txt
37%
git reset A.txt
0%
git restore A.txt
16%
git rm A.txt
63%
git restore --staged A.txt
🟣 Потоки вводу/виводу (Input/Output Streams, stdin/stdout/stderr)

Повернемось до теми Корисні речі, які варто знати про процес

У попередньому прикладі коду я використав такий вивід:
print("Usage: python script.py <num1> <num2>", file=sys.stderr)

Що це значить?
Подивимось у документацію:
print(*objects, sep=' ', end='\n', file=None, flush=False)

The file argument must be an object with a write(string) method; if it is not present or None,
sys.stdout will be used. Since printed arguments are converted to text strings,
print() cannot be used with binary mode file objects. For these, use file.write(...) instead.

🔗 Документація

Простими слова file це те куди виводити рядок нашого повідомлення. По замовченню вивід відбувається у sys.stdout. Також вивід може відбуватись у реальний файл або у поток sys.stdout - спеціальний потік для помилок.

⚠️ Варто зауважити: що потік в/в в анг. варіанті це stream i/o і не варто його плутати з thread - потоком виконання.

sys.stdout як sys.stderr це два потоки для виводу (stream output) обидва виводять текст у консоль користувач не бачить різницю між ними візуально.
При програмній автоматизації процесів можливо перехоплювати текст з обох потоків, можемо окремо мати звичайний тест інформаційного характеру з sys.stdout і окремо з sys.stderr

Є ще третій поток sys.stdin - це поток для вводу, він необхідний для читання вводу користувача у консоль.
При програмній автоматизації ми також можемо вводити текст замість користувача.

👉 Практична цінність знання про потоки в/в полягає саме у можливості автоматизувати взаємодію між процесами (IPC) шляхом їх перехоплення.
👍1
🟢 Потоки введення/виведення. Практика.

У Python для створення підпроцесів використовується бібліотека subprocess.
Вона дозволяє запускати програми та працювати з їхніми потоками введення/виведення.
subprocess добре підходить для простих випадків з синхронном кодом.

Але цікавіше розглянути асинхронний приклад з asyncio, який працює одразу з усіма трьома потоками введення/виведення.

Ідея проста: запускаємо Python у інтерактивному режимі та виконуємо дві операції — 2+2 і 1/0.

import asyncio
import sys


async def read_stream(name: str, stream: asyncio.StreamReader):
while data := await stream.readline():
line = data.decode("utf8").rstrip()
print(f"[{name}]", line)


async def main():
process = await asyncio.create_subprocess_exec(
sys.executable, "-i", # python -i
stdin=asyncio.subprocess.PIPE,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)

stdout_task = asyncio.create_task(
read_stream("stdout", process.stdout),
)
stderr_task = asyncio.create_task(
read_stream("stderr", process.stderr),
)

process.stdin.write(b"2+2\n")
await process.stdin.drain()

process.stdin.write(b"1/0\n")
await process.stdin.drain()

process.stdin.write(b"exit()\n")
await process.stdin.drain()

await process.wait() # Чекаємо завершення підпроцесу

Вивід у консоль:
[stderr] Python 3.11.6 (tags/v3.11.6:8b6ee5b, Oct 2 2023, 14:57:12) [MSC v.1935 64 bit (AMD64)] on win32
[stderr] Type "help", "copyright", "credits" or "license" for more information.
[stdout] 4
[stderr] >>> >>> Traceback (most recent call last):
[stderr] File "<stdin>", line 1, in <module>
[stderr] ZeroDivisionError: division by zero
[stderr] >>>


Як бачимо ми отримали текст окремо stdout і окремо stderr.

Звісно аналогічним чином ми можемо запускати системі утіліти або інші програми написані на інших мовах програмування — це простір для автоматизації.

Але трохи дивно чому python пише текст привітання саме у stderr
Трохи про Rotating Proxy.
(Гадаю ця інформація буде корисна при покупці проксі для скрапінгу даних.)

По режиму керування:

1. Per-request rotation
2. Session-based rotation
3. Automated request management

За типом інфраструктури/провайдера:

1. Residential High reliability Real home IPs
2. Datacenter Fast & cost-efficient Server IPs
3. Mobile Carrier IPs Mobile-network routing
4. ISP Datacenter speed Consumer-ISP routing

#proxy

https://www.youtube.com/watch?v=YTQVusxV-Bs
Please open Telegram to view this post
VIEW IN TELEGRAM
👏1