Как можно сделать чтобы этот кусок кода загружался по определённому условию например когда доступен 22 порт на сервер. Саму проверку порта я реализовал. НО проблема состоит в том что при загрузке скрипта когда доходит до загрузки этих строк в самом конф. файле сразу идет подключение, и если начинать экспериментировать с открытием/закрытием порта то падает в ошибку (если порт закрыт) или нет.
То есть
что-то типа если функция проверки порта возвращает True идет загрузка кода. Если False то этот кусок кода не загружается с конфига. Если такое возможно...
Что мешает тебе сначала проврить условие и только потом выполнять подключение? Но на самом деле, тебе никакие проверки не нужны, тебе нужно лишь обработать возникающее исключение с помощью try-except.
Но как сделать это так чтоб это строки загрузилась или нет после выполнения функции проверки порта. а не до нее.
Так как сам скрипт состоит с что в есть 1 main_code и доп. файлы к нему.
пробовал создавать пустую переменную и ей присваивать новое значения после выполнение функции проверки порта но результата не дало. Пуская переменная лежит в конфиге, новую создаю в main_code но при запуске все остальные функции тянут эту переменную как пустую. НО па после перезаписи они не вытягивают новые значения.
Так сейчас правильно же всё, код для подключения не должен быть в файле конфигурации. Тебе нужно вынести туда не подключение, а значения username и password.
Что действительно не так в коде:
# while continue_working is True:
while continue_working:
#def_check_network_connection = check_host(port)
# if def_check_network_connection is True:
if check_host(port):
Но на самом деле проверка вообще не нужна:
try:
sftp = pysftp.Connection(host, username='user', password='passwd', cnopts=cnopts)
except IOError: # ошибку лучше уточнить. Проверь, какая вылазит, её и подставь
print('...')
break
#if max_count_recreating == 0:
# continue_working = False
# continue
if not max_count_recreating:
break
#if def_parameters_for_7zip is 0 or 1: # здесь у тебя всегда истина
if def_parameters_for_7zip in (0, 1):
И старайся не изменять то, что задано в конфиге, относить к конфигу как к константе и всегда создавай отдельные локальные переменные, а уже их изменяй (они на самом деле у тебя и так локальные, но так всё равно делать не стоит).
потом мы создаем функцию get_conn
объявляем глобальною переменную _conn
и если ее нет соедениия то мы перезаписываем ее значения в конфиге
правильно я понял ?
И эту функцию я могу вызвать сразу после проверки порта ??
объявляем глобальною переменную _conn и если ее нет соедениия то мы перезаписываем ее значения в конфиге правильно я понял ?
Да, только объявлена переменная вне функции, а в функции только указан скоуп. Если не указать скоуп, переменная будет объвлена внутри функции. Мало того, до проверки глобальной перед заданием локальной дело даже не дойдет, всё свалится с UnboundLocalError.
Что или я не то или лыже не те:)
Итого сделал я отдельный файл:
from backup_v4.config import *
sftp = None
def create_connection():
global sftp
if not sftp:
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
sftp = pysftp.Connection(host, username='user', password='password', cnopts=cnopts)
return sftp
подгрузил его в main_code
from backup_v4.check_network_connection import *
from backup_v4.path_for_logs_and_backups import path_is_exists
from backup_v4.parameters_for_7zip import parameters_for_7z
from backup_v4.rename_backup import renamed_backup
from backup_v4.check_archive import check_archive
from backup_v4.calculating_copies_of_files import calc_copies_files
from backup_v4.delete_old_files import delete_old_files
from backup_v4.attach_email_file import attach_email
from backup_v4.send_email import send_email
from backup_v4.send_email_host_down import send_email_host_down
from backup_v4.sftp_connection import *
from backup_v4.config import *
Итого после проверки порта и перехода на следующий функцию это проверка наличие каталога на сервере(ее код)
from backup_v4.sftp_connection import *
def path_is_exists(path_for_files):
#
# Checking path for logs and backups.If paths are not exist, create them.
#
if not sftp.exists(path_for_files):
create_dirs = sftp.makedirs(path_for_files)
flag_for_create_dirs = True
return flag_for_create_dirs
else:
flag_for_create_dirs = False
return flag_for_create_dirs
То я получаю след. ошибку
File "C:\Users\user\PycharmProjects\untitled\backup_v4\path_for_logs_and_backups.py", line 8, in path_is_exists
if not sftp.exists(path_for_files):
AttributeError: 'NoneType' object has no attribute 'exists'
я тогда понять не могу чего не меняется значение переменной sftp с None на строку подключения.
from backup_v4 import sftp_connection
if not sftp_connection.sftp.exists(path_for_files):
— вот так работать будет, если ты уже подключился.
Но я не зря назвал переменную _conn в примере с подчёркивания, это конвенция именования приватных полей. Лучше просто каждый раз вызывай функцию там, где тебе нужно получить соединение.
Да спасибо заработало. А как в идеале бы такое подключение сделать ? Если не отталкиваться от моего уровня знаний/умений по питону, интересно... ?
Или тут полностью этот скрипт переписать нужно будет.
Если это просто скрипт, который отрабатывает и умирает, то и так сойдёт.
Безотносительно данного конкретного случая, работа с соединениями это слишком большая тема, нет смысла пытаться её здесь раскрыть. Тут нужна хорошо обдуманная лекция на часок.