# -*- coding: utf-8 -*-
import typing as t
import itertools
def print_table(headers: t.Dict[str, str], data: t.Iterable[t.Dict[str, str]]) -> None:
keys: t.List[str] = list(headers.keys()) #список ключей в таблице - чтобы сохранять порядок столбцов
split_data: t.List[t.Dict[str, t.List[str]]] = [] #ячейки, разбитые на строки
max_widths: t.Dict[str, int] = { key:len(value) for key,value in headers.items() } #ширина каждого столбца в таблице
for line in data:
#разбиваем ячейки строки на текстовые строки по \n
split_line: t.Dict[str, t.List[str]] = { key:value.splitlines() for key,value in line.items() }
#обновляем ширину столбцов, если надо
for key in keys:
new_width = max(map(len, split_line.get(key, [''])))
if new_width > max_widths[key]:
max_widths[key] = new_width
split_data.append(split_line)
#выводим заголовки
for key in keys:
print(f'{{0:<{max_widths[key]}}}'.format(headers[key]), end='|') #можно вместо | поставить пробел
print()
print( '+'.join('-'*v for v in max_widths.values()) + '|') #разделитель заголовка и тела таблицы
#выводим строки таблицы
for row in split_data:
for parts in itertools.zip_longest(*(row[key] for key in keys)):
#parts - кортеж, где каждый элемент либо строка в очередной ячейке, либо None
for key,part in zip(keys, parts):
#None означает, что в этой ячейке строки текста уже кончились
print(f'{{0:<{max_widths[key]}}}'.format(part if part is not None else ''), end='|')
print()
print( '+'.join('-'*v for v in max_widths.values()) + '|') #разделитель строк, если надо
data = [
{'ip':'192.168.0.2', 'model':'DES-3200-26', 'uptime': '3d 12:03:05', 'uplink state': '25: up\n26:up', 'uplink err': '0\n11', 'uplink mcast': '24560\n113'},
{'ip':'192.168.0.2', 'model':'DES-3200-52', 'uptime': '1d 04:00:15', 'uplink state': '49: up\n50:up\n51:down\n52:down', 'uplink err': '10\n1133\n0\n0', 'uplink mcast': '5497812\n3145\n0\n0'},
]
headers = {'ip': 'IP address', 'model': 'Model', 'uptime': 'Uptime', 'uplink state': 'Uplink state', 'uplink err': 'Uplink errors', 'uplink mcast': 'Uplink M-cast'}
print_table(headers, data)
IP address |Model |Uptime |Uplink state|Uplink errors|Uplink M-cast|
-----------+-----------+-----------+------------+-------------+-------------|
192.168.0.2|DES-3200-26|3d 12:03:05|25: up |0 |24560 |
| | |26:up |11 |113 |
-----------+-----------+-----------+------------+-------------+-------------|
192.168.0.2|DES-3200-52|1d 04:00:15|49: up |10 |5497812 |
| | |50:up |1133 |3145 |
| | |51:down |0 |0 |
| | |52:down |0 |0 |
-----------+-----------+-----------+------------+-------------+-------------|
Например, чтобы запустить написанный код на другом пк нужно притащить туда интерпретатор python, накатить все библиотеки которые используются в моем творении и запустить скрипт, и будет все это крутиться в консоли.
А как им пользуются, запускают код, он "крутиться" что то там делает или вызывают питоновские скрипты из других языков.
class search_time(Thread):
def __init__(self):
super().__init__()
self.dej = ""
self.dej2 = ""
self.dej_mutex = threading.Lock()
def run(self):
#в коде run запись в self.dej1 или self.dej2 делается строго так
if self.dej_mutex.acquire(): #если Lock уже занят вторым потоком, первый подождёт освобождения
self.dej1 = "Вася Пупкин"
self.dej2 = "Жора Золотарёв"
self.dej_mutex.release() #а теперь сами освободим Lock, чтобы второй поток мог обратиться к переменным
class runbot(Thread):
def __init__(self, st):
super().__init__()
self.st = st
def run(self):
#в коде обращение к dej1 или dej2 делается строго так
if self.st.dej_mutex.acquire(): #если Lock сейчас занят первым потоком, ждём освобождения
print(self.st.dej1, self.st.dej2) #используем переменные
self.st.dej_mutex.release() #а теперь сами освободим Lock, чтобы первый поток мог обратиться к переменным
w1 = search_time()
w1.start()
w2 = runbot(w1)
w2.start()
sum = 0
for n in range(0, X): #X - то что над знаком суммы
V = ... #выражение, зависящее от n - то что справа от знака суммы
sum += v
for line in db.query("..."):
do_something(line)
result = db.query("...")
if result is not None:
for line in result:
do_something(line)
langs = ['en-us', 'en-mc', 'en-gb', 'en-im', 'en-je', 'en-vg', 'en-ie', 'en-lu', 'sv-se', 'en-by', 'en-md', 'en-al', 'en-xk', 'en-me', 'fr-fr', 'fr-bl', 'fr-ch', 'es-es', 'it-it', 'it-sm', 'pt-pt', 'de-de', 'de-at', 'de-li', 'de-ch', 'nl-nl', 'nl-be', 'en-no', 'en-sj', 'en-fi', 'en-ax', 'en-dk', 'en-gl', 'en-is', 'ru-ru', 'pl-pl', 'bg-bg', 'cs-cz', 'el-gr', 'hu-hu', 'lt-lt', 'ro-ro', 'sk-sk', 'uk-ua', 'en-lv', 'en-rs', 'en-si', 'en-ba', 'en-cy', 'en-ee', 'en-hr', 'en-mk', 'en-mt', 'en-ph', 'en-mm', 'en-kh', 'en-mn', 'en-kz', 'en-la', 'en-za', 'en-ck', 'fr-ca', 'en-au', 'en-nz', 'es-ar', 'es-gt', 'es-do', 'es-hn', 'es-ni', 'es-pa', 'es-ec', 'es-py', 'es-ve', 'en-ae', 'en-lb', 'en-il', 'en-pk', 'id-id', 'tr-tr', 'ko-kr', 'th-th', 'en-ca', 'es-co', 'en-sg', 'zh-hk', 'zh-cn', 'en-in', 'en-bd', 'en-lk', 'en-np', 'en-mv', 'pt-br', 'es-pe', 'en-hk', 'ar', 'es-mx', 'ja-jp', 'en-my', 'vi-vn', 'zh-tw', 'en-se']
lang_pairs = { l.partition('-')[0]:l for l in langs }
#подготавливаем таблицу замены символов
transform_table = str.maketrans( { 'X': 'Z', 'Z': 'X' } )
#функция, производящая один проход преобразования строки
#input[::-1] - это строка, развернутая наоборот
#метод translate() заменяет символы согласно указанной таблице замен
def transform_once(input: str) -> str:
return input + 'X' + input[::-1].translate(transform_table)
#функция, производящая несколько проходов преобразования строки
def transform_multiple(input: str, t: int) -> str:
for _ in range(t):
input = transform_once(input)
return input
cd /opt/my_python_project && sudo -u username /opt/my_python_project/bin/python3 /opt/my_python_project/main.py