Показаны сообщения с ярлыком Python. Показать все сообщения
Показаны сообщения с ярлыком Python. Показать все сообщения

понедельник, 15 июля 2019 г.

Python запуск команд на удаленном сервере over SSH

Установка

pip3 install paramiko

Пример проверки есть ли уже пользователь на удаленном компьютере:

import paramiko

host = '10.81.156.13'
user = 'root'
#файл может находится в любом удобном месте
keyfilename = '/root/ssh_key_for cheking/id_rsa'
create_user = "newuser"

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
k = paramiko.RSAKey.from_private_key_file(keyfilename)
ssh.connect(hostname=host, port=22, username=user, pkey=k)

cmd = 'grep -c -w ' + create_user + ' /etc/passwd'

ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd)

result_ssh = ssh_stdout.readlines()
result_ssh = "".join(result_ssh)
#print(result_ssh[0])

if result_ssh[0] == '0' and result_ssh[0].isdigit():
    print("user not exists and it will be created")



четверг, 27 июня 2019 г.

Python generate ssh key for server ssh access

Установка

pip3 install pycryptodome

Пример:

from os import chmod
from Crypto.PublicKey import RSA

key = RSA.generate(4096)
with open("id_rsa", 'wb') as content_file:
    chmod("id_rsa", 0o600)
    content_file.write(key.exportKey('PEM'))
pubkey = key.publickey()
with open("id_rsa.pub", 'wb') as content_file:
    chmod("id_rsa.pub", 0o600)
    content_file.write(pubkey.exportKey('OpenSSH'))

exportKey('PEM') exportKey('OpenSSH') PEM формат нужен для приватного ключа, OpenSSH - для паблик ключа.
В chmod permissions указаны в соответствии python-дружественным синтаксисом 0o600. 

среда, 26 июня 2019 г.

Python OptionParser парсер аргументов строки запуска приложения

link
if __name__ == "__main__":
    parser = OptionParser()
    group = OptionGroup(parser, "Merge Options",
                        "By default, only issues with status "
                        "['To Test' and 'Pending'] will be merged")
    group.add_option("--merge-status-in-progress",
                     action="store_true",
                     dest="merge_in_progress",
                     default=False,
                     help="Merge issue branches with status"
                     "In progress + 100 % [default: False]")
    group.add_option("--merge-all-outdated-branches",
                     action="store_true",
                     dest="merge_all_outdated_branches",
                     default=False,
                     help="Merge all outdated branches")

    parser.add_option_group(group)
    (options, args) = parser.parse_args()

    if options.merge_all_outdated_branches:
        sys.exit(merge_outdated_branches())

    sys.exit(auto_merge(options.merge_in_progress))

Запуск app-merge.py --merge-status-in-progress и без опции вызовет выполнение функции auto_merge()app-merge.py --merge-all-outdated-branches вызовет выполнение функции merge_outdated_branches()

action="store_true" аргумент без параметров (--a)
action="store" аргумент с параметрами (--a 10)

Python форматирование даты

Дату из формата 2019-06-25T09:10:50 +0000 преобразовать в формат 25-06-2019

import datetime

datetime.datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%f%z').strftime("%d-%m-%Y")

переменную v iso формата преобразуем в нужный формат %d-%m-%Y (+0000 - это %z)

Пример со сравнением дат:

current_date = datetime.datetime.now()

# дата старше на две недели в iso формате
curr_time_minus_two_weeks = datetime.datetime.isoformat(current_date - timedelta(weeks=2))

for br in branches:
    branches = project.branches.list(all=True)
    for k, v in br.commit.items():
        # check whether commited date older tnan current date in two weeks
        if k == "committed_date" and v < curr_time_minus_two_weeks:
            logger.info("Branch: %s", br.name)            
            logger.info("committed date %s is older than two weeks ago %s", datetime.datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%f%z').strftime("%d-%m-%Y"), datetime.datetime.strptime(curr_time_minus_two_weeks, '%Y-%m-%dT%H:%M:%S.%f').strftime("%d-%m-%Y"))

вторник, 18 июня 2019 г.

Python gitlab branches

List of branches with excluding protected branches and cherry-pick hotfix revert patch words in name of branches

        gitlab_abc = gitlab.Gitlab(GITLAB_URL, TOKEN, api_version=4)
        project = gitlab_abc.projects.get(ABC_PROJECT)

        branches = project.branches.list(all=True)
        for br in branches:
            if not(br.protected) and "cherry-pick" not in br.name and "revert" not in br.name and "hotfix" not in br.name and "patch" not in br.name:
                print("br.name: ", br.name)
                for k, v in br.commit.items():
                    if k == "committed_date":
                        print("committed_date: ", v)

br.name:  issue-1234
committed_date:  2019-05-15T14:39:35.000+00:00

вторник, 12 марта 2019 г.

Python Mongodb examples

1) count of hits within day

db.aclog.find().limit(1)
{ "_id" : ObjectId("5c8668883896e834e079d372"), "ip" : "74.208.58.75", "datetime" : "06/Mar/2019:06:25:15 +0000", "getpost" : "GET /wppluginfile/defscript HTTP/1.0", "status" : "200", "sbyte" : "31", "refer" : "-", "agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36", "loadtime" : "0.011" }


from pymongo import MongoClient
import pprint

conn = MongoClient()
db = conn.accesslog
coll = db.aclog

pipeline = [{"$project": {"_id": 0, "day_of_month": {"$substr": ["$datetime", 0, 2]}}},
    {"$group": {"_id": {"day_of_month": "$day_of_month"}, "hits": {"$sum": 1}}},
    {"$sort": {"hits": -1}}
]

pprint.pprint(list(db.aclog.aggregate(pipeline)))

conn.close()

result
[{'_id': {'day_of_month': '05'}, 'hits': 157148},
 {'_id': {'day_of_month': '06'}, 'hits': 61932}]

"$substr": ["$datetime", 0, 2] - cut the date from "06/Mar/2019:06:25:15 +0000"

вторник, 5 марта 2019 г.

Linux Python parse dynamic js site

1) Install google-chrome on server
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
echo "deb http://dl.google.com/linux/chrome/deb/ stable main" | tee /etc/apt/sources.list.d/google-chrome.list
apt update && apt -y install google-chrome-stable
google-chrome --version
Google Chrome 72.0.3626.121

четверг, 10 января 2019 г.

Linux Install Pyrhon 3.6 with pyenv

Мне нужно установить новую версию только для определенного пользователя.
отсюда
apt update && apt install git build-essential libbz2-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev zlib1g-dev
su user
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
добавил в .bashrc, как было рекомендовано после установки

export PATH="/home/user/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

pyenv install 3.6.4 (pyenv uninstall 3.6.4)
pyenv virtualenv 3.6.4 general (или pyenv virtualenv 3.6.4 other_proj and pyenv local other_proj)
pyenv global general (pyenv uninstall general)

(general) user@server:~$ python -V
Python 3.6.4

После этого, если выйти и зайти, то окружение для пользователя сохраняется.

вторник, 4 февраля 2014 г.

Python вычисление расстояния Хемминга между двоичными числами

Расстоянием Хемминга d(a,b) между двумя двоичными словами a и b называют число не совпадающих позиций в них. Для строк, количество различающихся позиций для строк с одинаковой длинной. Расстояние Хэмминга уже довольно широко используется для различных задач, таких как поиск близких дубликатов, распознавание образов, классификация документов, исправление ошибок, обнаружения вирусов и т.д.
Рассчитывается расстояние для двоичных чисел как исключающее ИЛИ (XOR) между двумя этими числами сложенное поэлементно. Например:
117 = 0 1 1 1 0 1 0 1 
  17 = 0 0 0 1 0 0 0 1 
   H = 0+1+1+0+0+1+0+0 = 3 - расстояние Хемминга
код на Python
int(reduce(lambda x, y: int(x) + int(y), list(bin(a ^ b)[2:])))
или
str(bin(a^b)).count('1')

вторник, 14 января 2014 г.

Python однострочник нахождения списка простых чисел от 2 до n (решето Эратосфена)

sorted(set(range(2,n+1)).difference(set((p * f) for p in range(2,int(n**0.5) + 2) for f in range(2,(n/p)+1))))
Взято отсюда

Python нахождение числового палиндрома

"А роза упала на лапу Азора" - палиндром, 131 - числовой палиндром.
Решение: число представляю в виде строки, прохожу по циклу от 0 до половины размера строки и сравниваю последовательно симметрично i и -(i +1). Все одинаковые значения добавляются в список и в конце сравниваю размер списка с половиной размера строки. Если равны - то палиндром.
Дебаг:
x = 1234321
for i in xrange(len(str(x)) // 2):    
    if str(x)[i] == str(x)[-(i + 1)]:
        print str(x)[i] 
Привожу в однострочник:
if len([i for i in xrange(len(str(x)) // 2) if str(x)[i] == str(x)[-(i + 1)]]) == len(xrange(len(str(x)) // 2)):
    print 'Палиндром'

Или красивое решение :)
def isPalindrom(n):
    """
    Check integer for palindrom
    >>> isPalindrom(131)
    True
    >>> isPalindrom(130)
    False
    """
    return str(n) == str(n)[::-1]

воскресенье, 29 декабря 2013 г.

Python добавление разделителей разрядов в числах

Задача: имеем на входе строку, слова в которой разделены пробелом. Если в строке попадается число, то вставляем точки как разделители разрядов. На выходе нужно получить строку.
Например: text =

'123456' => '123.456'
'333' => '333'
'9999999' => '9.999.999'
'123456 567890' => '123.456 567.890'
'price is 5799' => 'price is 5.799'
'he was born in 1966th' => 'he was born in 1966th'

вторник, 24 декабря 2013 г.

четверг, 19 декабря 2013 г.

Python создаём словарь из двух списков

Задача: из двух списков получить словарь, где первый список ключи словаря, второй - значения

key_dict = [1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000]
value_dict = ['I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M']
dict_out = {}

for x, y in zip(key_dict, value_dict):
    dict_out[x] = y

print dict_out
{1: 'I', 4: 'IV', 5: 'V', 9: 'IX', 10: 'X', 40: 'XL', 50: 'L', 90: 'XC', 100: 'C', 400: 'CD', 500: 'D', 900: 'CM', 1000: 'M'}
zip(key_dict, value_dict) создает список такого вида [(1, 'I'), (4, 'IV') ...]



суббота, 14 декабря 2013 г.

Python преобразовать список из [1, [2, 3], 4] в [1, 2, 3, 4]


Задача: преобразовать список из такого типа [1, [2, 3], 4]   в    [1, 2, 3, 4]

check_lst = [[[2]], [4, [5, 6, [6], 6, 6, 6]]]

def check(lst):
    check_bool = True
    out_lst = []
    copy_lst = list(lst)
    while check_bool:
        check_bool = False
        for i in copy_lst:            
            if isinstance(i, list):
                check_bool = True
                out_lst.extend(i)
            else:
                out_lst.append(i)
        if check_bool:
            copy_lst = list(out_lst)
            out_lst = []            
    return out_lst

print check(check_lst)

[2, 4, 5, 6, 6, 6, 6, 6]
Лучшее решение

пятница, 13 декабря 2013 г.

Python использование set с классом

Задача: создадим класс, создадим пустой set. Заполним set экземплярами созданного класса. Для примера пусть экземпляры будут случайным целым числом из диапазона 0-9. Теперь мы хотим удалить из set-а все экземпляры класса значения которых совпадают с "9" и "8"

Где это можно применить на практике? В gamedeveloping игра "Астероид", в set добавляем все летающие по экрану камни, пробегаемся по set-у и сверяем дистанцию между кораблем и камнями:
для этого вычисляем дистанцию между координатами центров фигур
>>> def dist(p, q):
>>>     return math.sqrt((p[0] - q[0]) ** 2 + (p[1] - q[1]) ** 2)
и вычитаем радиус корабля и радиус камня, если получившееся значение <= 0 значит столкновение, то добавляем экземпляр класса камень во временный set. После окончания обхода set-а с камнями - удаляем из этого set-а временный set (один или более камней при столкновении) и уменьшаем счетчик жизней кораблю.

четверг, 12 декабря 2013 г.

Инвайт для сайта по изучению языка Python


Инвайт для сайта по изучению языка Python в игровой форме с левелами и медальками. Мини - задачки представленные на этом сайте взяты оттуда. После решения задачки, можно посмотреть лучшие решения.

Python tic-tac-toe крестики-нолики 3Х3

Классические крестики нолики 3Х3. Функция должна возвращать в случае выигрыша символ победителя "Х" или "О". Если ничья (draw) - "D". На вход функции подается подобный 2-мерный массив список. Если клетка не заполнена, то символ "."

game_result = [
        u"OOX",
        u"XXO",
        u"OXX"]

Python преобразование числа [0-999] в текст

Например преобразовать 310 => three hundred ten

среда, 11 декабря 2013 г.

Python полезности для игры Астероид

Выход за границы области экрана
>>> self.pos[0] = (self.pos[0] + self.vel[0]) % WIDTH
>>> self.pos[1] = (self.pos[1] + self.vel[1]) % HEIGHT
pos - координаты центра движущейся фигуры

Увеличение скорости астероидов в зависимости от счета score
# increase rock's velocity using score
for rock in rock_group:
    for i in range(2):
        rock.vel[i] = rock.init_vel[i] + (rock.init_vel[i] * score * 0.03)
или
rock_vel[i] = rock_vel[i] * (1 + score / 3)

Столкновение спрайтов (p q - координаты центров сталкивающихся спрайтов, dist - расчет дистанции между спрайтами)
def dist(p, q):
    return math.sqrt((p[0] - q[0]) ** 2 + (p[1] - q[1]) ** 2) 

def collide(self, other_object):
        return dist(self.pos, other_object.pos) <= self.radius + other_object.radius