консоль python в роли командной строки часть 2

консоль python в роли командной строки часть 1
заглянуть
Работа с WWW
сервер
запускает HTTP для всех локальных интерфейсов на порту 8080
python -m SimpleHTTPServer 8080 # python2
python3 -m http.server 8080
python3 -m http.server 8080 --cgi # запустить в папке, где находится каталог cgi-bin
# со сценарием cgi
открыть в браузере адреса
http://0.0.0.0:8080/ или http://localhost:8080/ или http://127.0.0.1:8080/
python -m SimpleHTTPServer # без указания порта запустит сервер на порту 8000
python3 -m http.server
запускает сервер SMTP на порту 1025
python -m smtpd -n -c DebuggingServer localhost:1025
запустить сервер SMTP на стандартном порту 25
sudo python -m smtpd -n -c DebuggingServer localhost:25
http://rus-linux.net/nlib.php?name=/MyLDP/consol/oneliners.html
работа с http
import webbrowser
webbrowser.open('http://www.habrahabr.ru/') # открыть ссылку в браузере
webbrowser.open(u'file://home/user/mysite.html')
webbrowser.open(u'mailto:foo@bar.com?subject=Feedback%20message') # открыть почтовый клиент создать письмо
http://habrahabr.ru/post/62383/
если нет модуля webbrowser то
apt-get install python-pip python3-pip
pip install webbrowser
http://rtfm.co.ua/python-utilita-pip-pypi/
http://asvetlov.blogspot.ru/2014/05/pip.html
import urllib2
urllib2.urlopen('http://www.example.com/').read() # скачать файл по протоколу http
работа с ftp
from ftplib import FTP
f = FTP('ftp.gnu.org')
f.login('','') # f.login('login', 'password')
for x in f.nlst()[:9]: print(x)
L = []
f.dir(L.append)
for x in L[:15]: print(x)
f.nlst()
f.dir()
f.nlst()[17]
remotefiles=f.nlst()[17]
localdir = '/home/user/path/'
localpath = os.path.join(localdir, remotefiles)
localfile = open(localpath, 'wb')
f.retrbinary('RETR ' + remotefiles, localfile.write)
localfile.close()
import os
os.listdir()
pypi install wget
import wget
wget.download("http://www.python.org/")
Экранирование тегов html
>>> import cgi
>>> cgi.escape('a < b > c & d "spam"', 1)
'a < b > c & d "spam"'
>>> s = cgi.escape("1<2 <b>hello</b>")
>>> s
'1<2 <b>hello</b>'
>>>
>>> import html
>>> html.escape('a < b > c & d "spam"', 1)
'a < b > c & d "spam"'
>>> s = html.escape("1<2 <b>hello</b>")
>>> s
'1<2 <b>hello</b>'
>>> import cgi, html.parser
>>> s = cgi.escape("1<2 <b>hello</b>")
>>> s
'1<2 <b>hello</b>'
>>>
>>> html.parser.HTMLParser().unescape(s)
'1<2 <b>hello</b>'
>>>
>>> import html, html.parser
>>> s = html.escape("1<2 <b>hello</b>")
>>> s
'1<2 <b>hello</b>'
>>> html.parser.HTMLParser().unescape(s)
'1<2 <b>hello</b>'
>>> import urllib.parse
>>> urllib.parse.quote("a & b #! c")
'a%20%26%20b%20%23%21%20c'
>>> urllib.parse.quote_plus("C:\stuff\spam.txt")
'C%3A%5Cstuff%5Cspam.txt'
>>> x = urllib.parse.quote_plus("a & b #! c")
>>> x
'a+%26+b+%23%21+c'
>>> urllib.parse.unquote_plus(x)
'a & b #! c'
Экранирование адресов URL
>>> import urllib.parse >>> b='http://lurkmore.to/Монти_Пайтон' >>> urllib.parse.quote(b) 'http%3A//lurkmore.to/%D0%9C%D0%BE%D0%BD%D1%82%D0%B8_%D0%9F%D0%B0%D0%B9%D1%82%D0%BE%D0%BD' >>> d=urllib.parse.quote(b) >>> d 'http%3A//lurkmore.to/%D0%9C%D0%BE%D0%BD%D1%82%D0%B8_%D0%9F%D0%B0%D0%B9%D1%82%D0%BE%D0%BD' >>> urllib.parse.unquote(d) 'http://lurkmore.to/Монти_Пайтон'
Экранирование адресов URL с якорями
python3 >>> >>> import urllib.parse >>> s='http://lurkmore.to/%D0%9A%D0%BE%D0%BF%D0%B8%D0%BF%D0%B0%D1%81%D1%82%D0%B0:Python#.D0.9E.D1.80.D0.B8.D0.B3.D0.B8.D0.BD.D0.B0.D0.BB' >>> (a,b)=s.split('#') >>> a 'http://lurkmore.to/%D0%9A%D0%BE%D0%BF%D0%B8%D0%BF%D0%B0%D1%81%D1%82%D0%B0:Python' >>> b '.D0.9E.D1.80.D0.B8.D0.B3.D0.B8.D0.BD.D0.B0.D0.BB' >>> b=b.replace('.','%') >>> b '%D0%9E%D1%80%D0%B8%D0%B3%D0%B8%D0%BD%D0%B0%D0%BB' >>> j=a+'#'+b >>> j 'http://lurkmore.to/%D0%9A%D0%BE%D0%BF%D0%B8%D0%BF%D0%B0%D1%81%D1%82%D0%B0:Python#%D0%9E%D1%80%D0%B8%D0%B3%D0%B8%D0%BD%D0%B0%D0%BB' >>> >>> l=urllib.parse.unquote(j) >>> l 'http://lurkmore.to/Копипаста:Python#Оригинал'
Почтовые вложения и ссылки base64
>>> import base64 >>> base64.b64decode('aHR0cDovLzR1ZnJlZS50ay9tZWRpYTcyMzY0Ni9mdWVuZi8wMzYubXAz') b'http://4ufree.tk/media723646/fuenf/036.mp3'
Шифрование
a ^ b ^ b == a >>> 1925^99 2022 >>> 2022^99 1925 шифрование искажение символов (простое) sys.stderr.write('using simple\n') adder = 1 def do_encode(pswd): pswd = 'vs' + pswd + '48' res = '' for char in pswd: res += chr(ord(char) + adder) # увеличить каждый код ASCII return str(res) def do_decode(pswd): pswd = pswd[2:-2] res = '' for char in pswd: res += chr(ord(char) - adder) return res http://pythonlearn.ru/без-рубрики/shifrovanie-strok-s-pomoshhyu-modulya-hashlib-python/ >>> import hashlib >>> h = hashlib.sha1(b"password") >>> h = hashlib.sha1() >>> h.update(b"password") >>> h = hashlib.sha1(b"password") >>> h.digest() '[\xaaa\xe4\xc9\xb9??\x06\x82%\x0bl\xf83\x1b~\xe6\x8f\xd8' >>> h.hexdigest() '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8' >>> import hashlib >>> h = hashlib.md5(b"password") >>> p = h.hexdigest() >>> p '5f4dcc3b5aa765d61d8327deb882cf99' >>> p # Пароль, сохраненный в базе '5f4dcc3b5aa765d61d8327deb882cf99' >>> h2 = hashlib.md5(b"password") # Пароль, введенный пользователем >>> if p == h2.hexdigest(): print("Пароль правильный") ... Пароль правильный http://ivinside.blogspot.ru/2012/04/aes-pycrypto.html from Crypto.Cipher import AES import base64 import os # размер блока шифрования BLOCK_SIZE = 32 # символ, использующийся для дополнения шифруемых данных # до размера, кратного 32 байтам PADDING = '{' # функция дополнения pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING # функции шифрования и расшифрования # результат дополнительно обертывается в base64 EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) # генерируем ключ secret = os.urandom(BLOCK_SIZE) # создаем объект cipher = AES.new(secret) # шифруем строку encoded = EncodeAES(cipher, 'password') print 'Encrypted string:', encoded # расшифровываем строку decoded = DecodeAES(cipher, encoded) print 'Decrypted string:', decoded
Простое шифрование с openssl
http://www.py-my.ru/post/554f1ca43ad2ff04ff2d41ba
Шифруем:
openssl aes-256-cbc -in input_file -out output_file
Дешифруем:
openssl aes-256-cbc -d -in input_file -out output_file
При выполнении запрашивается пароль.
Изображения
мануал
Pillow
$ pip install Pillow
from PIL import Image, ImageFilter
# Считываем изображение
im = Image.open( 'image.jpg' )
# Показываем изображение
im.show()
# Применяем фильтр к изображению
im_sharp = im.filter( ImageFilter.SHARPEN )
# Сохраняем отфильтрованное изображение в новый файл
im_sharp.save( 'image_sharpened.jpg', 'JPEG' )
# Разбиваем изображение на соответствующие bands (то есть на красный, зеленый # и синий для RGB) r,g,b = im_sharp.split()
# Просматриваем данные EXIF, встроенные в изображение
exif_data = im._getexif() exif_data
Как легко вырезать фон на изображении с помощью Python
# pip install rembg pillow
from rembg import remove
from PIL import Image
input_path = "in.png"
output_path = "out.png"
input = Image.open(input_path)
output = remove(input)
output.save(output_path)
python rembg - изменить цвет фона
это даст вам вывод с полностью красным фоном.
removeim = remove(im,bgcolor=[255,0,0,255])
измените bgcolor=[255,0,0,255] на bgcolor=[0,255,0,255], чтобы получить полностью зеленый фон.
cv2
распознавание лиц в реальном времени, видео в реальном времени
https://github.com/Itseez/opencv/blob/master/samples/python/facedetect.py
http://tinyurl.com/opencv3-py-tutorial
http://tinyurl.com/opencv3-py3-ubuntu
http://tinyurl.com/opencv3-py3-anaconda
from cv2 import * import numpy as np
# Считываем изображение img = cv2.imread('testimg.jpg')
# Показываем изображение
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# Применяем к изображению фильтр Grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Сохраняем отфильтрованное изображение в новый файл
cv2.imwrite('graytest.jpg',gray)
Scikit-Image
http://scikit-image.org/docs/dev/auto_examples/
Разные модули
модуль Wget
https://pypi.python.org/pypi/wget
>>> import wget >>> wget.download("http://www.python.org/")или
python -m wget [options]
модуль xonsh
http://xon.sh/
Xonsh is a Python-ish, BASHwards-looking shell language and command prompt.
модуль sh
http://amoffat.github.io/sh/
>>> from sh import tar >>> tar("cvf", "/tmp/test.tar", "/my/home/directory/") >>> from sh import ls >>> print(ls("/")) >>> from sh import ifconfig >>> print(ifconfig("wlan0")) >>> from sh import find >>> find("/tmp")
psutil
https://github.com/giampaolo/psutil
>>> import psutil >>> psutil.cpu_times() >>> psutil.virtual_memory() >>> psutil.swap_memory() >>> psutil.disk_partitions() >>> psutil.disk_usage('/') >>> psutil.net_io_counters(pernic=True) >>> psutil.net_connections() >>> psutil.net_if_addrs() >>> psutil.net_if_stats() >>> psutil.users() ....................
PyAutoGui модуль управления компьютером
pip install pyautogui
import pyautogui as pg
# Получение позиции мыши и вывод в консоль
print(pg.position())
# Передвижение мыши
pg.move(50, 50, duration=0.5)
pg.moveTo(150, 200, 0.5) # Передвигаем к точке относительно экрана
# Нажатие мышкой по определенной точке
pg.click(769, 101)
pg.doubleclick(769, 101) # двойное нажатие
pg.rightclick(769, 101) # нажатие правой кнопкной мыши
pg.leftclick(769, 101) # нажатие левой кнопкной мыши
# Ввод текста
pg.typewrite("itproger.com")
# Выполнения нажатия на клавишу
pg.typewrite(["enter"])
# Выполнения нажатия на сочетание клавиш
pg.hotkey("winleft")
pg.hotkey("winleft", "up")
pg.hotkey("ctrl", "t")
# Вызов различных всплывающих окон
pg.alert("Окно с информацией", "Название окна", button="Текст на кнопке")
age = pg.prompt("Укажите возраст: ", "Название окна")
print(age)
pg.confirm("Вам больше 18?", "Название окна", ("Да, точно", "Нет"))
pg.password("Введите пароль", "Название окна")
# Создание скриншота
pg.screenshot("yourPic.png")
# Мини программа
website = pg.prompt("Введите название сайта:", "Веб сайт", "https://")
pg.click(769, 101)
pg.typewrite(website)
pg.typewrite(["enter"])
pg.screenshot("yourPic.png")
Отладка в python через консоль
href="http://www.py-my.ru/post/4e37737b1d41c8451b000002
Запуск скрипта в отладчике
$ python -m pdb script.py
Либо можно прописать запуск отладчика в самом скрипте, для этого нужно добавить код
import pdb
pdb.set_trace()
Команды help Список команд list Отображение листинга, отображает точки останова - "B" в начале строки list s,e Часть листинга: s - начальная строка, e - конечная строка next Выполнить следующую команду текущего метода step Выполнить следующую команду со входом внутрь методов return Выполнить текущий метод до конца until Выполнить до конца метода/цикла args Вывести список локальных переменных locals() Отображение текущей области видимости (команда не отладчика) quit Выйти из отладчика where Определить текущее местоположение up Перемещение по стеку вверх down Перемещение по стеку вниз p value Вывести на экран значение (print) pp value Более красивый вывод на экран !command Выполнить произвольную команду jump Перейти на строку (выполнить до строки) run [ 'script.py', 'a', 'b', 'c'] Перезапуск скрипта с параметрами alias pl pp %1 Создать алиас команды, %1 - входящий параметр unalias pl Удаление алиаса Точки останова break Просмотр установленных т.о. и их номеров disable 1 Отключить т.о. по номеру enable 1 Включить т.о. по номеру break 15 Установить т.о. на указанной строке break foo Установить т.о. на методе break ../script2.py:15 Установить т.о. в другом файле break 15, i>7 Установить т.о. с условием condition 1 i>0 Назначить условие на существующую т.о. tbreak 15 Временная т.о., удаляется при достижении continue Продолжить выполнение скрипта clear Удалить все т.о. clear 1 Удалить т.о. под номером 1 ignore 1 10 Установка счетчика "не срабатывания", для т.о. 1, пропустить 10 остановок commands 1 ... end Создать сценарий для т.о. 1 Настройки по умолчанию можно сохранить в файле ~/.pdbrc и ./.pdbrc (последний переопределяет настройки первого)
Кратко в деталях
https://unixhow.com/3849/kak-zapustit-python-skript-v-rezhime-otladki
Вам нужно запустить ваш скрипт на пайтоне, используя модель pdb (Python Debug): python -m pdb merge_lists.py Увидите нечто такое: python -m pdb merge_lists.py > /Users/and3001/Documents/Personal/Coding/Python/merge_lists.py(3)() -> my_list = [3, 4, 6, 10, 11, 15] (Pdb) Что бы продолжить работу, нажмите n (next). Так пошагово разберете все шаги вашего скрипта. (Pdb) n > /Users/and3001/Documents/Personal/Coding/Python/merge_lists.py(4) () -> alices_list = [1, 5, 8, 12, 14, 19] (Pdb) Что бы выйти, нажмите q
Разное
выполнение строки
python3 -c "print(bin(255))"
echo "print(bin(255))" |python3
документация по модулям
pydoc -p 8080
http://localhost:8080/
вывод AST и cкомпилированного кода в веб-интерфейсе
$ pip install instaviz
vi test.py
python3 test.py
printf
https://stackoverflow.com/questions/63627692/making-the-printf-function-of-c-into-python
https://stackoverflow.com/questions/19457227/how-to-print-like-printf-in-python3
импорт из Си import ctypes libc = ctypes.cdll.LoadLibrary("libc.so.6") printf = libc.printf printf(b'num: %d, txt: %s\n', 42, b'Hello World') # b' - обязательно импорт из sys import sys def printf(format, *args): sys.stdout.write(format % args) printf('num: %d, txt: %s\n', 42, 'Hello World') сделать функцию def printf(text, *args): print(text % args) printf('num: %d, txt: %s\n', 42, 'Hello World')
привести код в порядок
python3 -m pip install flake8
flake8 myscript.py # проверить как и где именно нарушается стиль
python3 -m pip install black
black --check myscript.py # проверить будет ли black изменять файл
black --diff myscript.py # показать изменения
black myscript.py # отформатировать
показать текущее время с датой
>>> impotr time
>>> time.ctime(time.time())
>>> time.asctime()
Uuid
>>> import uuid
>>> print uuid.uuid4()
# e7bafa3d-274e-4b0a-b9cc-d898957b4b61
Progressbar
узнать все зарезервированные слова
>>> import keyword >>> keyword.kwlist
li=[]
if not li: print "empty" # проверить список на пустоту
"12345".zfill(10) # дополнить строку нулями
hasattr(a,'attributename') # узнать имеет ли объект атрибут в Python?
сделать отсортированный список по значениям из cловаря
newlist = sorted(list_to_be_sorted, key=lambda k: k['name'])
разбить список на части одинакового размера
def chunks(l, n): for i in xrange(0, len(l), n): yield l[i:i+n]
выполнить код в зависимости от версии интерпретатора
import sys import __future__ if sys.version_info[0] == 2: # Python 2 code else: # Python 3 code
или
if sys.version[:1] == '2': # Python 2 code else: # Python 3 code
найти файл либы
аналог
ldconfig -p |grep udev
import ctypes.util
ctypes.util.find_library("udev")
в сборке с musl не работает, поэтому патч
https://git.alpinelinux.org/aports/tree/main/python3/musl-find_library.patch
Поймать несколько исключений в одной строке
except (Exception1, Exception2) as e: pass
http://www.user.su/Основы_Python
http://jenyay.net/Programming/Python
легендарный FuzzBuzz
https://megamozg.ru/post/23556/
https://megamozg.ru/post/10308/
В поисках компактного FizzBuzz на Python
a = list(range(1, 101)) for i in a: if i%15 == 0: print(i, 'FuzzBuzz') if i%3 == 0 and i%15!=0: print(i, 'Fuzz') if i%5 == 0 and i%15!=0: print(i, 'Buzz') Начнём со стандартного, классического решения: for i in range(1, 101): if i%3==0 and i%5==0: print('FizzBuzz') elif i%3==0: print('Fizz') elif i%5==0: print('Buzz') else: print(i) Укладываем стандартное решение в стандартный однострочник print('\n'.join('FizzBuzz' if i%3==0 and i%5==0 else 'Fizz' if i%3==0 else 'Buzz' if i%5==0 else str(i) for i in range(1, 101))) Избавляемся от Join, приручаем Print [print('FizzBuzz' if i%3==0 and i%5==0 else 'Fizz' if i%3==0 else 'Buzz' if i%5==0 else i) for i in range(1, 101)] Добавляем срез, укрощаем if else [print('FizzBuzz'[4 if i%3 else 0:4 if i%5 else 8] or i) for i in range(1, 101)] Оптимизируем срез, избавляемся от if else [print('FizzBuzz'[i*i%3*4:8--i**4%5] or i) for i in range(1, 101)] Сократили неплохо. Но, похоже с этой вариацией дальше не продвинуться. Пробуем иной вариант. Заменяем срез конкатенацией, вертаем оператор modulo [print('Fizz'*(i%3==0)+'Buzz'*(i%5==0) or i) for i in range(1, 101)] Оптимизируем решение. Выравниваем по длине со срезом [print((i%3<1)*'Fizz'+(i%5<1)*'Buzz' or i) for i in range(1, 101)] Уходим в отрыв. Модифицируем окончательный вариант [print(i%3//2*'Fizz'+i%5//4*'Buzz' or i+1) for i in range(100)] А если избавиться от списка, будет ещё короче и, возможно, быстрее: for i in range(100):print(i%3//2*'Fizz'+i%5//4*'Buzz'or i+1)
Занимательные фигуры на Python в одну строку
странности
(Link) >>> type( {} ),type( { () } ) (, ) >>> 1, + 2, (1, 2) >>> (1,) + (2,) (1, 2) >>> (1,) + 2, Traceback (most recent call last): File "<input ... >", line 1, in (1,) + 2 >>> __ = [1,2]; _= range(5);[_ for _ in _ if _ not in __] [0, 3, 4] >>> __ [1, 2]
Кристиан Майер «Однострочники Python» 2022
https://github.com/finxter/PythonOneLiners