Python Заметки
2.22K subscribers
62 photos
2 videos
2 files
229 links
Интересные заметки и обучающие материалы по Python

Контакт: @paulwinex

⚠️ Рекламу на канале не делаю!⚠️

Хештеги для поиска:
#tricks
#libs
#pep
#basic
#regex
#qt
#django
#2to3
#source
#offtop
Download Telegram
Иногда бывает ситуация когда dev-сервер по какой-либо причине не закрылся и висит в процессах, занимая порт.
Это может быть из-за падения IDE или просто сам забыл погасить и закрыл терминал.
Для таких случаев я набросал простую функцию с командой:

kill_on_port() {
port=$(lsof -t -i:$1)
echo "KILL PROCESS:" $port
sudo kill -9 $port
}
alias killonport="kill_on_port $@"

Код поместить в ~/.bashrc и рестартнуть систему.

Если во время старта dev-сервера получаете ошибку что порт уже занят, просто выполните команду, подставив свой порт.

Bash
kill_on_port 8000

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

#linux
А знаете ли вы, что в Bash есть особая переменная "$_" ? Из описания можно узнать, что в переменную "$_" помещается последний аргумент последней команды.

Что-то знакомое? Конечно, в Python есть примерно тоже самое.

Мы знаем, что дата первого релиза Bash (8 июня 1989) несколько раньше чем первый релиз Python (20 февраля 1991). Если учесть, что по задумке автора Python это агрегация самых успешных практик отовсюду, можно ли сказать что именно эта фишка к нему пришла из Bash? Ни подтверждения ни опровержения я пока не нашел.
Давайте просто считать это совпадением 😉

А как это может быть полезно в Bash?
Приведу простой пример, который оценят те, кто часто работает в терминале.

Допустим, нам надо создать директорию и зайти в неё. Что обычно делаем?

:~$ mkdir foldername 
:~$ cd foldername
:~/foldername$

Как это сделать в одну команду?

:~$ mkdir foldername && cd foldername 
:~/foldername$

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

:~$ mkdir foldername && cd $_
:~/foldername$

_________________
PS.
Символы "&&"" разделяют команды и означают, что требуется выполнить вторую команду только если первая завершилась успешно.


#linux #tricks
Python + bash
Если вам часто требуется запускать shell команды из Python-кода, какой способ вы используете?
Самый низкоуровневый это функция os.system(), либо os.popen(). Рекомендованный способ это subprocess.call(). Но это всё еще достаточно неудобно.

Советую обратить своё внимание на очень крутую библиотеку sh.

Что она умеет?

🔸 удобный синтаксис вызова команд как функций

# os
import os
os.system("tar cvf demo.tar ~/")

# subprocess
import subprocess
subprocess.call(['tar', 'cvf', 'demo.tar', '~/'])

# sh
import sh
sh.tar('cvf', 'demo.tar', "~/")

🔸 простое создание функции-алиаса для длинной команды

fn = sh.lsof.bake('-i', '-P', '-n')
output = sh.grep(fn(), 'LISTEN')

в этом примере также задействован пайпинг

🔸 удобный вызов команд от sudo

with sh.contrib.sudo:
print(ls("/root"))

Такой запрос спросит пароль. Чтобы это работало нужно соответствующим способом настроить юзера.
А вот вариант с вводом пароля через код.

password = "secret"
sudo = sh.sudo.bake("-S", _in=password+"\n")
print(sudo.ls("/root"))

Это не все фишки. Больше интересных примеров смотрите в документации.

Специально для Windows💀 юзеров

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

🔸 Для Windows, качаем архив, запускаем redis-server.exe

🔸 Для Linux несколько команд

🔸 Если есть Docker, то еще проще

docker run --rm  -p 6379:6379 redis

Всё, можно экспериментировать!
______________________
А еще с сервером можно поиграть в пинг-понг

> redis-cli ping
PONG

#tricks #libs #linux
Я нашел самый быстрый способ поднять свой независимый и бесплатный VPN
Сразу оговорка, платить придётся только за хостинг.

1️⃣ Покупаем сервер где-то на просторах интернета. Конечно же сервер должен находиться за пределами страны. Например я закупился на https://eurohoster.org/ (не реклама). Проверяйте лимиты по трафику, в идеале - без ограничений.

2️⃣ Ставим docker

sudo apt install docker.io

Если удобней с DockerCompose то ставим и его

sudo apt install docker-compose

3️⃣ Ставим WG-EASY

Самый простой способ поднять сервис WireGuard c WebUI это проект wg-easy
Код и документация здесь
https://github.com/weejewel/wg-easy

Запускаем контейнер:
https://github.com/weejewel/wg-easy#2-run-wireguard-easy

Для тех кто с DockerCompose, забираем файл здесь:
https://gist.github.com/paulwinex/be87f79687b96786098ec8fa6a8e251c

В обоих случаях потребуется поменять две переменные:

WG_HOST - внешний статичный IP вашего сервера
PASSWORD - придумайте пароль для WEB UI

Остальные параметры указаны ниже на странице github https://github.com/weejewel/wg-easy#options

4️⃣ Ставим клиента

Все доступные клиенты здесь
https://www.wireguard.com/install/

Есть возможность добавить клиента в Network Manager для управления подключением через UI. Установка зависит от вашей системы, ищите мануалы в сети, их много.
https://github.com/max-moser/network-manager-wireguard

Скрипт установки для RasperryPi
https://gist.github.com/paulwinex/c2c4090f19dbe8bd1253c5744f3f06e1

ЗЫ. Конечно же это не "самый простой" и далеко не единственный способ. А просто тот, который использую я сам.

#offtop #linux
👍18🔥2
В Linux стандартными средствами можно использовать часть оперативной памяти как диск. Для этого требуется указать тип монтирования tmpfs в команде mount

mount -t tmpfs -o size=5G tmpfs /mnt/ram

Теперь путь /mnt/ram можно использовать как обычный каталог. Для чего это может быть нужно?

▫️ Скорость работы с таким каталогом выше чем многие SSD и тем более HDD.
▫️ Если у вас очень быстрый SSD на NVMe M.2 то такой способ особо не прибавит вам скорости, но поможет сохранить ресурс SSD когда требуется обрабатывать очень много мелких файлов и оперативка позволяет выделить нужный объем.
▫️ Оперативка это энергозависимая память, поэтому выключении питания все файлы безвозвратно теряются. Такой "non persistent" каталог гарантирует удаление временных файлов.

Я написал небольшой скрипт для условного теста и сравнения скорости копирования файлов между SSD и RAM.
Вот мои результаты:

Single File Size: 30.0Gb

ssd > ssd: 0:00:12.850 / 2.3Gb/s
sdd > ram: 0:00:06.453 / 4.6Gb/s
ram > ram: 0:00:06.995 / 4.3Gb/s
ram > sdd: 0:00:06.217 / 4.8Gb/s

Dir size: 32.7Gb, File count: 11127

ssd > ssd: 0:00:15.063 / 2.2Gb/s
sdd > ram: 0:00:08.486 / 3.9Gb/s
ram > ram: 0:00:08.032 / 4.1Gb/s
ram > sdd: 0:00:07.026 / 4.7Gb/s

Скрипт для теста ↗️

На моём железе прирост скорости ~2x. Плюс экономия ресурса SSD.

В Windows такой фишки по умолчанию нет, но обязательно найдутся аналогичные решения

#linux #triks
👍9🔥21
reload_flag=""
if [[ -n "${DEBUG}" ]]; then
reload_flag="--reload"
fi

if [[ -n "${WORKER_COUNT}" ]]; then
workers=${WORKER_COUNT}
else
workers=2
fi

gunicorn --workers ${workers} \
--bind 0.0.0.0:8000 \
${reload_flag} main.wsgi

Писали такие конструкции чтобы проверить наличие флага и сформировать команду правильно?
На самом деле можно сделать тоже самое проще. Для этого используются операторы условной подстановки, доступные в оболочках семейства POSIX.

:- для установки значений по умолчанию
${WORKER_COUNT:-2}

Если переменная не объявлена, то будет дефолтное значение 2.

:+ подставляет указанный текст, если переменная не пуста
${DEBUG:+--reload}

Если что-то есть в переменной то распечатается текст после символа +, в противном случае - ничего. Удобно для опциональных флагов, как в нашем примере.

Итого наш скрипт может выглядеть так:
gunicorn --workers ${WORKER_COUNT:-2} \
--bind 0.0.0.0:8000 \
${DEBUG:+--reload} main.wsgi


Есть еще два оператора.

:= не только подставить дефолтное значение, но и присвоить его переменной, если она пуста
# никаких переменных еще нет
VAL1=${VAL2:=hello}
# теперь доступны обе
echo $VAL1 $VAL2
# hello hello


:? остановить выполнение с ошибкой, если переменной нет.
echo ${MISS:?is required}
bash: MISS: is required

Код выхода будет 1.

#tricks #linux
👍5
А что происходит на противоположном фронте?
Вы, вероятно, слышали, что 2026 год называют годом Linux на десктопе (в каких-то узких кругах - годом гейминга на Linux). Всё потому, что экосистема Linux постепенно становится более дружелюбной для обычных десктоп-юзеров (в том числе привыкших к Windows), и не только!

▫️ всё чаще появляются Linux дистрибутивы визуально похожие на Windows (или даже лучше), и множество видео с советами какой дистрибутив попробовать новичкам.

▫️ обновления ядра и любых пакетов в экосистеме Linux всегда привносят оптимизацию и удобство и поддержку свежего железа (привет винде с её обратной тенденцией). Например грядущая версия 7.0, опять с множеством приятных мелочей.

▫️ после 10 лет с последего релиза версии 5 окружение KDE Plasma получила мажорный апдейт версии 6 и активно развивается (уже доросла до 6.5). GNOME тоже не спит и готовит версию 50.

▫️ в Wine добавили патч позволяющий устанавливать продукты Adobe на Linux. Для кого-то это был последний рубеж?😏

▫️ Proton активно развивается, да так, что через эту прослойку игры работают даже быстрей чем нативно на винде.

▫️ с каждым релизом Wine и Proton поддерживается всё больше игр, что можно отслеживать на ProtonDB, и даже случаются бусты производительности.

▫️ Я сам на днях на виндобук поставил ChacyOS после чего игры, которые тянули гдето в 5-10 FPS, стали играбельными! Подтверждено личным опытом! Кстати, есть несколько дистрибутивов заточенные именно под игры.

▫️ Valve выпускают новую пачку железок которые (предположительно) порвут рынок гейминга (как и в прошлый раз) и (определнно точно) работают на Linux. Именно Valve вливает ресурсы в Linux в целом и в Proton в частности.

▫️ Госсектор разных стран давно уже мигрирует на opensource, так как нет доверия системе которая может одномоментно неконтролируемо массово рухнуть или быть удаленно заблокированной (в том числе по политическим причинам).

И ниже небольшой опрос - какая у вас операционка основная?

Ни к чему не призываю, ничего не советую! Просто подмечаю тенденцию и хочется узнать мнения из первых рук 😉

Знаю, что Linux тоже не идеален, знаю что каждой задаче - свой инструмент. Но это не тема поста, так что можно без холиваров)


#offtop #linux