uzverss: (Default)
uzverss ([personal profile] uzverss) wrote2015-12-25 02:35 pm

консоль 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 &lt; b &gt; c &amp; d &quot;spam&quot;'
>>> s = cgi.escape("1<2 <b>hello</b>")
>>> s
'1&lt;2 &lt;b&gt;hello&lt;/b&gt;'
>>>
>>> import html
>>> html.escape('a < b > c & d "spam"', 1)
'a &lt; b &gt; c &amp; d &quot;spam&quot;'
>>> s = html.escape("1<2 <b>hello</b>")
>>> s
'1&lt;2 &lt;b&gt;hello&lt;/b&gt;'

>>> import cgi, html.parser
>>> s = cgi.escape("1<2 <b>hello</b>")
>>> s
'1&lt;2 &lt;b&gt;hello&lt;/b&gt;'
>>>
>>> html.parser.HTMLParser().unescape(s)
'1<2 <b>hello</b>'
>>>
>>> import html, html.parser
>>> s = html.escape("1<2 <b>hello</b>")
>>> s
'1&lt;2 &lt;b&gt;hello&lt;/b&gt;'
>>> 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)




pyperclip
взято тут
видеоуроки по теме

pip3 install pyperclip




Занимательные фигуры на 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

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting