Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
develop:pyton:sqlite [2022/07/13 10:10] admin |
develop:pyton:sqlite [2024/07/15 05:29] (текущий) admin |
||
---|---|---|---|
Строка 2: | Строка 2: | ||
- | ==== Аргументы командной | + | ===== Модули/Настройки окружения ===== |
- | Параметры с префиксом тире необязательные, без префикса обязательные | + | <code bash> |
+ | # Установка модуля для | ||
+ | python3.8 -m pip install pyTelegramBotAPI | ||
+ | # Модуль для телеграм бота бота | ||
+ | pyTelegramBotAPI | ||
+ | # Модуль для json логов | ||
+ | python-json-logger | ||
+ | # Модуль для виндовых хостов | ||
+ | / | ||
+ | (узнать на каком именно питоне работает ансибл ansible --version) | ||
+ | # | ||
+ | pip3 install --upgrade pip | ||
+ | pip3 install --upgrade setuptools | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Аргументы командной строки ===== | ||
+ | Параметры с префиксом тире необязательные, | ||
< | < | ||
* **name or flags** - или имя, или список строк опций, например foo или -f, --foo, | * **name or flags** - или имя, или список строк опций, например foo или -f, --foo, | ||
Строка 48: | Строка 65: | ||
- | ==== Web API === | ||
+ | ===== Zabbix Web API ===== | ||
< | < | ||
< | < | ||
Строка 82: | Строка 99: | ||
</ | </ | ||
- | ==== SQLite ==== | ||
+ | < | ||
+ | < | ||
+ | <code python> | ||
+ | query= """ | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | }""" | ||
+ | answer= requests.post(' | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== SQLite ===== | ||
< | < | ||
< | < | ||
Строка 113: | Строка 148: | ||
#for row in cur.fetchall(): | #for row in cur.fetchall(): | ||
# print(row)</ | # print(row)</ | ||
- | |||
# | # | ||
Строка 125: | Строка 159: | ||
#for member in r: | #for member in r: | ||
# print(member[0]+ ' -==- '+ member[1]) | # print(member[0]+ ' -==- '+ member[1]) | ||
- | |||
</ | </ | ||
Строка 159: | Строка 192: | ||
self.cur.execute(' | self.cur.execute(' | ||
return self.cur.fetchall(); | return self.cur.fetchall(); | ||
- | |||
- | |||
def main(): | def main(): | ||
Строка 199: | Строка 230: | ||
print(answer.json()); | print(answer.json()); | ||
print(' | print(' | ||
- | | ||
# | # | ||
- | |||
if __name__ == " | if __name__ == " | ||
Строка 209: | Строка 238: | ||
- | ==== Работа с текстом === | ||
+ | ===== Работа с текстом ===== | ||
< | < | ||
< | < | ||
Строка 276: | Строка 305: | ||
- | ==== e-mail === | + | ===== e-mail ===== |
< | < | ||
< | < | ||
Строка 285: | Строка 313: | ||
<code python> | <code python> | ||
# | # | ||
- | |||
import smtplib | import smtplib | ||
Строка 318: | Строка 345: | ||
server=" | server=" | ||
assert isinstance(send_to, | assert isinstance(send_to, | ||
- | |||
msg = MIMEMultipart() | msg = MIMEMultipart() | ||
msg[' | msg[' | ||
Строка 345: | Строка 371: | ||
- | ==== Файлы === | ||
+ | ===== Файлы ===== | ||
* **read()** - загружает **весь файл в ОЗУ** | * **read()** - загружает **весь файл в ОЗУ** | ||
* **readline()** - читает одну строчку | * **readline()** - читает одну строчку | ||
* **for line in file:** - цикл обработки всего файла построчно | * **for line in file:** - цикл обработки всего файла построчно | ||
- | * ** ** - | ||
- | |||
< | < | ||
< | < | ||
Строка 368: | Строка 392: | ||
- | ==== WSGI Server === | + | ===== WSGI Server |
Сервер может обрабатывать веб запросы, | Сервер может обрабатывать веб запросы, | ||
- | |||
Переменная **environ** содержит служебную информацию о клиенте\\ | Переменная **environ** содержит служебную информацию о клиенте\\ | ||
В **start_response** собсна помещаем ответ | В **start_response** собсна помещаем ответ | ||
- | |||
< | < | ||
< | < | ||
<code python> | <code python> | ||
# | # | ||
- | |||
import wsgiserver | import wsgiserver | ||
from wsgiref.simple_server import make_server, | from wsgiref.simple_server import make_server, | ||
Строка 402: | Строка 423: | ||
</ | </ | ||
</ | </ | ||
- | |||
Строка 409: | Строка 429: | ||
**raw** получаем вручную\\ | **raw** получаем вручную\\ | ||
**pip install beautifulsoup4**\\ | **pip install beautifulsoup4**\\ | ||
- | |||
<code python> | <code python> | ||
from bs4 import BeautifulSoup | from bs4 import BeautifulSoup | ||
Строка 454: | Строка 473: | ||
outfile.write('; | outfile.write('; | ||
count += 1 | count += 1 | ||
- | | ||
print(" | print(" | ||
- | |||
if __name__ == " | if __name__ == " | ||
Строка 464: | Строка 481: | ||
- | ==== Yandex Disk API === | ||
+ | ===== Yandex Disk API ===== | ||
< | < | ||
< | < | ||
Строка 522: | Строка 539: | ||
' | ' | ||
bar.finish() | bar.finish() | ||
- | |||
if __name__ == ' | if __name__ == ' | ||
Строка 528: | Строка 544: | ||
# | # | ||
</ | </ | ||
+ | {{: | ||
</ | </ | ||
+ | < | ||
+ | < | ||
+ | <code python> | ||
+ | # | ||
- | ==== Хеш функции. Hashlib === | + | import os, argparse |
+ | import requests | ||
+ | from datetime import datetime | ||
+ | from progress.bar import Bar | ||
+ | |||
+ | argParser= argparse.ArgumentParser() | ||
+ | argParser.add_argument(' | ||
+ | argParser.add_argument(' | ||
+ | args= argParser.parse_args() | ||
+ | |||
+ | URL = ' | ||
+ | TOKEN = ' | ||
+ | headers = {' | ||
+ | |||
+ | def create_folder(path): | ||
+ | """ | ||
+ | requests.put(f' | ||
+ | |||
+ | def upload_file(loadfile, | ||
+ | """ | ||
+ | savefile: Путь к файлу на Диске | ||
+ | loadfile: Путь к загружаемому файлу | ||
+ | replace: true or false Замена файла на Диске""" | ||
+ | res = requests.get(f' | ||
+ | with open(loadfile, | ||
+ | try: | ||
+ | requests.put(res[' | ||
+ | except KeyError: | ||
+ | print(res) | ||
+ | |||
+ | def backup(savepath, | ||
+ | """ | ||
+ | # Формируем название папки на диске, название целевой папки (из переданного пути) + дата-время | ||
+ | # `loadpath.split('/' | ||
+ | date_folder = ' | ||
+ | |||
+ | create_folder(savepath) | ||
+ | # ф-я `os.walk` возвращает массив файлов из дерева каталогов (в параметрах можно указать направление обхода) | ||
+ | # возвращает тройной кортеж - " | ||
+ | # по дефолту вложенность вся, идет по порядку от указанного пути и далее | ||
+ | for address, _, files in os.walk(loadpath): | ||
+ | # тут создаем подпапки, | ||
+ | # `address.replace(loadpath, | ||
+ | create_folder(' | ||
+ | bar = Bar(' | ||
+ | # Циклом проходим по всем файлам что есть в данном каталоге | ||
+ | for file in files: | ||
+ | bar.next() | ||
+ | # в первой части путь в ФС, во второй путь на диске, исходный снова вырезан | ||
+ | upload_file(' | ||
+ | ' | ||
+ | bar.finish() | ||
+ | |||
+ | |||
+ | def backupOnce(diskFolder, | ||
+ | """ | ||
+ | # Формируем название папки на диске, название целевой папки (из переданного пути) + дата-время | ||
+ | # `uploadFilePath.split('/' | ||
+ | currDateTime = datetime.now().strftime(" | ||
+ | |||
+ | create_folder(diskFolder) | ||
+ | upload_file(uploadFilePath, | ||
+ | |||
+ | if __name__ == ' | ||
+ | backupOnce(args.saveFolder, | ||
+ | # | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Хеш функции. Hashlib | ||
Читать файл лучше всего по блокам, | Читать файл лучше всего по блокам, | ||
Собсна каждый алгоритм имеет свою функцию, | Собсна каждый алгоритм имеет свою функцию, | ||
**digest()** - хеш в виде байтов, | **digest()** - хеш в виде байтов, | ||
- | |||
- | |||
< | < | ||
< | < | ||
Строка 551: | Строка 642: | ||
hsh.update(fileData) | hsh.update(fileData) | ||
result= hsh.hexdigest() | result= hsh.hexdigest() | ||
- | |||
print(result) | print(result) | ||
</ | </ | ||
Строка 561: | Строка 651: | ||
<code python> | <code python> | ||
# | # | ||
- | |||
import hashlib, argparse, os | import hashlib, argparse, os | ||
Строка 572: | Строка 661: | ||
# Хеш из проверяемого файла | # Хеш из проверяемого файла | ||
# | # | ||
- | |||
# Перебираем целевую папку | # Перебираем целевую папку | ||
for file in os.listdir(args.folder): | for file in os.listdir(args.folder): | ||
currentHash= GetHash(args.folder +'/' | currentHash= GetHash(args.folder +'/' | ||
print(file +' - '+ currentHash) | print(file +' - '+ currentHash) | ||
- | |||
def GetHash(fullFileName): | def GetHash(fullFileName): | ||
Строка 588: | Строка 675: | ||
break | break | ||
md5.update(fileData) | md5.update(fileData) | ||
- | | ||
return md5.hexdigest() | return md5.hexdigest() | ||
- | |||
if __name__ == " | if __name__ == " | ||
Строка 599: | Строка 684: | ||
- | + | ===== Работа с оболочкой ===== | |
- | ==== Работа с оболочкой === | + | |
< | < | ||
< | < | ||
Строка 611: | Строка 694: | ||
print(var.stdout) | print(var.stdout) | ||
</ | </ | ||
- | |||
Вывод сразу на консоль, | Вывод сразу на консоль, | ||
<code python> | <code python> | ||
import os | import os | ||
- | |||
os.system(" | os.system(" | ||
</ | </ | ||
Строка 622: | Строка 703: | ||
- | ==== Цвет текста === | + | ===== Цвет текста ===== |
< | < | ||
< | < | ||
+ | {{: | ||
<code python> | <code python> | ||
class bcolors: | class bcolors: | ||
Строка 637: | Строка 718: | ||
BOLD = ' | BOLD = ' | ||
UNDERLINE = ' | UNDERLINE = ' | ||
- | | ||
print(bcolors.HEADER+ 'This is test TeXt in color' | print(bcolors.HEADER+ 'This is test TeXt in color' | ||
print(bcolors.OKBLUE+ 'This is test TeXt in color' | print(bcolors.OKBLUE+ 'This is test TeXt in color' | ||
Строка 650: | Строка 730: | ||
+ | < | ||
+ | < | ||
+ | <code python> | ||
+ | # | ||
+ | import subprocess, os | ||
+ | glNameNewImport= "" | ||
+ | glSelectedMultip= "" | ||
+ | glDictFreePorts= {} | ||
+ | glHostIP= "" | ||
+ | class bcolors: | ||
+ | HEADER = ' | ||
+ | OKBLUE = ' | ||
+ | OKCYAN = ' | ||
+ | OKGREEN = ' | ||
+ | WARNING = ' | ||
+ | FAIL = ' | ||
+ | ENDC = ' | ||
+ | BOLD = ' | ||
+ | UNDERLINE = ' | ||
- | ==== === | + | def main(): |
+ | global glNameNewImport | ||
+ | |||
+ | # | ||
+ | # -= IP адрес хоста | ||
+ | getHostIP() | ||
+ | |||
+ | # | ||
+ | # -= Имя нового инстанса | ||
+ | getNameNewImport() | ||
+ | |||
+ | # | ||
+ | # -= Ищем порты для нового инстанса (все) =- | ||
+ | GetFreePorts() | ||
+ | |||
+ | # | ||
+ | # -= Выбор мультипликатора =- | ||
+ | if SelectMultipl(): | ||
+ | # -= Ветка создания нового мультипл =- | ||
+ | createNewMultip() | ||
+ | |||
+ | # Создаем входящую директорию | ||
+ | CreateFolder("/ | ||
+ | |||
+ | # Шарим ее по самбе | ||
+ | addSambaShared("/ | ||
+ | else: | ||
+ | # -= Использование существующего =- | ||
+ | useExistMultip() | ||
+ | |||
+ | # | ||
+ | # Переходим к импорту | ||
+ | # -= Создаем входящую папку импорта и папки для ошибок =- | ||
+ | CreateFolder("/ | ||
+ | CreateFolder("/ | ||
+ | CreateFolder("/ | ||
+ | |||
+ | # | ||
+ | # -= Создаем копированием новый импорт, | ||
+ | createNewImport() | ||
+ | |||
+ | print(""" | ||
+ | Параметры следующие: | ||
+ | Имя: \033[92m'""" | ||
+ | Расположение: | ||
+ | Входящая директория: | ||
+ | Jmx-порт: | ||
+ | Командный порт: \033[92m'""" | ||
+ | Конфигурация импорта: | ||
+ | Общая конфигурация всех импортов: | ||
+ | Файл мультипликатор: | ||
+ | Укажите \033[96mпараметры импорта в БД\033[0m в файле конфигурации импорта | ||
+ | Используя Jmx-порт, | ||
+ | |||
+ | def getNameNewImport(): | ||
+ | """ | ||
+ | """ | ||
+ | global glNameNewImport | ||
+ | |||
+ | glNameNewImport= input(" | ||
+ | if len(glNameNewImport)== 0: | ||
+ | print(bcolors.FAIL+ "Вы не указали имя новому сервису, | ||
+ | exit(1) | ||
+ | |||
+ | # Проверим уникальность имени | ||
+ | existImports= subprocess.run(' | ||
+ | if glNameNewImport in existImports: | ||
+ | print(bcolors.FAIL+ " | ||
+ | exit(1) | ||
+ | |||
+ | def createNewImport(): | ||
+ | """ | ||
+ | """ | ||
+ | global glNameNewImport, | ||
+ | |||
+ | # Копированием создаем сам новый мультип | ||
+ | subprocess.run(' | ||
+ | |||
+ | # Меняем права доступа юзеру mgaimport | ||
+ | subprocess.run(' | ||
+ | |||
+ | # Пишем параметры в " | ||
+ | Configuration= subprocess.run(" | ||
+ | |||
+ | Configuration= Configuration.replace(' | ||
+ | Configuration= Configuration.replace(' | ||
+ | Configuration= Configuration.replace(' | ||
+ | |||
+ | multipConfig= open("/ | ||
+ | multipConfig.write(Configuration) | ||
+ | multipConfig.close() | ||
+ | |||
+ | # Пишем параметры в " | ||
+ | Configuration= subprocess.run(" | ||
+ | |||
+ | Configuration= Configuration.replace(' | ||
+ | Configuration= Configuration.replace(' | ||
+ | Configuration= Configuration.replace(' | ||
+ | Configuration= Configuration.replace(' | ||
+ | |||
+ | multipConfig= open("/ | ||
+ | multipConfig.write(Configuration) | ||
+ | multipConfig.close() | ||
+ | |||
+ | # Делаем запись о новом мультипе в общем конфиге | ||
+ | newText= """ | ||
+ | # | ||
+ | ENABLE=" | ||
+ | JAVA_HOME=/ | ||
+ | START_USER=mgaimport | ||
+ | START_TIME=30 | ||
+ | STOP_TIME=90 | ||
+ | COMMAND_PORT=""" | ||
+ | WORKSPACE=/ | ||
+ | |||
+ | CMD=' | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -Xmx16G | ||
+ | -Xms3G | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -Dcom.sun.management.jmxremote | ||
+ | -Dcom.sun.management.jmxremote.port=""" | ||
+ | -Dcom.sun.management.jmxremote.authenticate=false | ||
+ | -Dcom.sun.management.jmxremote.ssl=false | ||
+ | -Djava.rmi.server.hostname=""" | ||
+ | -Djava.net.preferIPv4Stack=true | ||
+ | -jar mgaimport.jar' | ||
+ | |||
+ | configFile= open("/ | ||
+ | configFile.write(newText) | ||
+ | configFile.close() | ||
+ | |||
+ | def getHostIP(): | ||
+ | """ | ||
+ | """ | ||
+ | global glHostIP | ||
+ | |||
+ | # Получаем перечень ИПшников в системе | ||
+ | haveList= [] | ||
+ | haveList= subprocess.run(' | ||
+ | |||
+ | # Если не удалось, | ||
+ | if len(haveList) == 0: | ||
+ | glHostIP= input(' | ||
+ | if len(glHostIP)== 0: | ||
+ | print(bcolors.FAIL+ "Вы не указали IP адрес хоста, не надо так :("+ bcolors.ENDC) | ||
+ | exit(1) | ||
+ | elif len(haveList) == 1: | ||
+ | glHostIP= haveList[0] | ||
+ | else: | ||
+ | print(" | ||
+ | showList= {} | ||
+ | i= 1 | ||
+ | for itemIP in haveList: | ||
+ | showList[i] = itemIP | ||
+ | i += 1 | ||
+ | |||
+ | for x, y in showList.items(): | ||
+ | print(str(x) +" - "+ y) | ||
+ | |||
+ | SelectItem= input(" | ||
+ | if not SelectItem.isdigit(): | ||
+ | print(bcolors.FAIL+ " | ||
+ | exit(1) | ||
+ | |||
+ | glHostIP= showList[int(SelectItem)] | ||
+ | |||
+ | print(bcolors.OKGREEN+ "\nIP адрес хоста - "+ glHostIP+ bcolors.ENDC) | ||
+ | |||
+ | |||
+ | |||
+ | def addSambaShared(fullPath): | ||
+ | """ | ||
+ | Параметры дефолтные (для импортов) | ||
+ | """ | ||
+ | # Добавляем запись о новой шаре в конфиг самбы | ||
+ | newText= """ | ||
+ | path = """ | ||
+ | guest ok = no | ||
+ | browsable = no | ||
+ | writeable = yes | ||
+ | create mask = 0770 | ||
+ | directory mask = 0770 | ||
+ | write list = xlogssupplier | ||
+ | valid users = xlogssupplier | ||
+ | force user = mgaimport | ||
+ | force group = mgaimport\n""" | ||
+ | |||
+ | configFile= open("/ | ||
+ | configFile.write(newText) | ||
+ | configFile.close() | ||
+ | |||
+ | # Перезапускаем самбу | ||
+ | subprocess.run(' | ||
+ | |||
+ | # Напоминаем пользователю что нужно примонтировать ее на источнике источника | ||
+ | print(""" | ||
+ | Создана входящая папка для файлмультипликатора \033[96m'""" | ||
+ | К ней \033[96mоткрыт сетевой доступ\033[0m через " | ||
+ | |||
+ | |||
+ | |||
+ | def createNewMultip(): | ||
+ | """ | ||
+ | """ | ||
+ | global glNameNewImport, | ||
+ | |||
+ | # Копированием создаем сам новый мультип | ||
+ | subprocess.run(' | ||
+ | |||
+ | # Меняем права доступа юзеру mgaimport | ||
+ | subprocess.run(' | ||
+ | |||
+ | # Пишем параметры в конфиг нового мультипа | ||
+ | Configuration= subprocess.run(" | ||
+ | |||
+ | Configuration= Configuration.replace(' | ||
+ | Configuration= Configuration.replace(' | ||
+ | Configuration= Configuration.replace(' | ||
+ | Configuration= Configuration.replace(' | ||
+ | |||
+ | multipConfig= open("/ | ||
+ | multipConfig.write(Configuration) | ||
+ | multipConfig.close() | ||
+ | |||
+ | # Делаем запись о новом мультипе в общем конфиге | ||
+ | newText= """ | ||
+ | # ----------------------------------- | ||
+ | ENABLE=" | ||
+ | JAVA_HOME=/ | ||
+ | START_USER=mgaimport | ||
+ | START_TIME=5 | ||
+ | STOP_TIME=10 | ||
+ | WORKSPACE=/ | ||
+ | |||
+ | CMD=' | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -XX: | ||
+ | -Xmx2G | ||
+ | -Dcom.sun.management.jmxremote | ||
+ | -Dcom.sun.management.jmxremote.port=""" | ||
+ | -Dcom.sun.management.jmxremote.authenticate=false | ||
+ | -Dcom.sun.management.jmxremote.ssl=false | ||
+ | -Djava.rmi.server.hostname=""" | ||
+ | -Djava.net.preferIPv4Stack=true | ||
+ | -jar filemultiplicator-all.jar' | ||
+ | |||
+ | configFile= open("/ | ||
+ | configFile.write(newText) | ||
+ | configFile.close() | ||
+ | |||
+ | def useExistMultip(): | ||
+ | """ | ||
+ | дописываем в его конфиг блок по новому импорту | ||
+ | """ | ||
+ | global glNameNewImport, | ||
+ | |||
+ | newText= """ | ||
+ | name = \"""" | ||
+ | destDir = "/ | ||
+ | pattern = " | ||
+ | |||
+ | configFile= open("/ | ||
+ | configFile.write(newText) | ||
+ | configFile.close() | ||
+ | |||
+ | # Перезапуск сервиса, | ||
+ | os.system('/ | ||
+ | os.system('/ | ||
+ | |||
+ | def SelectMultipl(): | ||
+ | """ | ||
+ | """ | ||
+ | global glSelectedMultip | ||
+ | |||
+ | # Перечень мультипликаторов с путями из общешго конфига | ||
+ | listMultiplLocate= subprocess.run(' | ||
+ | |||
+ | # Проходим циклом, | ||
+ | availableMultiples= {} | ||
+ | i= 1 | ||
+ | listNamesForCheckUnique= [] | ||
+ | for itemLocate in listMultiplLocate: | ||
+ | availableMultiples[i] = { | ||
+ | ' | ||
+ | ' | ||
+ | i += 1 | ||
+ | listNamesForCheckUnique.append(itemLocate.split('/' | ||
+ | |||
+ | # Выводм перечеь доступных мультипликаторов пользователю, | ||
+ | print(" | ||
+ | print(" | ||
+ | for x, y in availableMultiples.items(): | ||
+ | print(str(x) +": "+ y[' | ||
+ | |||
+ | SelectItem= input(" | ||
+ | if not SelectItem.isdigit(): | ||
+ | print(bcolors.FAIL+ " | ||
+ | exit(1) | ||
+ | |||
+ | # Выбирается мультип либо создание нового если выбран 0 (или вне диапазона) | ||
+ | if int(SelectItem) in availableMultiples: | ||
+ | glSelectedMultip= availableMultiples[int(SelectItem)][' | ||
+ | return 0 | ||
+ | else: | ||
+ | glSelectedMultip= ' | ||
+ | print(bcolors.ENDC) | ||
+ | if glSelectedMultip== ' | ||
+ | print(bcolors.FAIL+ "Вы не указали имя новому сервису, | ||
+ | exit(1) | ||
+ | elif glSelectedMultip in listNamesForCheckUnique: | ||
+ | print(bcolors.FAIL+ " | ||
+ | exit(1) | ||
+ | return 1 | ||
+ | |||
+ | def CreateFolder(fullPath): | ||
+ | """ | ||
+ | """ | ||
+ | result= subprocess.run(' | ||
+ | if result.returncode: | ||
+ | if input(" | ||
+ | exit(1) | ||
+ | |||
+ | def GetFreePorts(): | ||
+ | """ | ||
+ | """ | ||
+ | global glDictFreePorts | ||
+ | |||
+ | # Мультипликатор | ||
+ | # Команный порт | ||
+ | MultipCommandPorts= subprocess.run(' | ||
+ | glDictFreePorts[' | ||
+ | |||
+ | # Jmx порт | ||
+ | MultipJmxPorts= subprocess.run(' | ||
+ | glDictFreePorts[' | ||
+ | |||
+ | # Импорт | ||
+ | # Команный порт | ||
+ | ImportCommandPorts= subprocess.run(' | ||
+ | glDictFreePorts[' | ||
+ | |||
+ | # Jmx порт | ||
+ | ImportJmxPorts= subprocess.run(' | ||
+ | glDictFreePorts[' | ||
+ | |||
+ | def FindFreePort(listExistPorts, | ||
+ | """ | ||
+ | Передаем сюда список используемых, | ||
+ | Если список пуст, используем начальный, | ||
+ | """ | ||
+ | if len(listExistPorts)== 0: | ||
+ | return str(defaultNewPort) | ||
+ | else: | ||
+ | listExistPorts.sort(reverse=True) | ||
+ | return str(int(listExistPorts[0])+ 1) | ||
+ | |||
+ | if __name__ == " | ||
+ | main() | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Кодировка ===== | ||
+ | [[https:// | ||
< | < | ||
- | < | + | < |
<code python> | <code python> | ||
+ | # При открытии файла | ||
+ | with open(my_file, | ||
+ | ... | ||
+ | |||
+ | # Так же проблема может возникнуть при записи в консоль | ||
+ | # Ошибка " | ||
+ | # Смысл в том что python путает какую кодировку принимает консоль, | ||
+ | # можно установить через переменную окружения, | ||
+ | set PYTHONIOENCODING=UTF-8 & python make_backup.py | ||
</ | </ | ||
</ | </ | ||
+ | |||
+ | |||
+ | ===== Ошибка при отсутствии lxml ===== | ||
+ | Была трабла при ее установке, | ||
+ | <code bash> | ||
+ | yum install python-devel | ||
+ | pip3 install -U pip setuptools | ||
+ | python3 -m pip install lxml | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Ошибка при отсутствии lxml ===== | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code python> | ||
+ | |||
+ | </ | ||
+ | </ | ||