Python Заметки
2.31K subscribers
58 photos
2 videos
2 files
212 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