Ошибка скрипта при вызове функции

Рейтинг: -2Ответов: 1Опубликовано: 06.06.2023

Есть необходимость в проверке правильности ввода данных до перехода к следующей переменной. Была добавлена дополнительная функция data, для получения от пользователя данных, запроса проверки и передачи в переменную другой функции, либо запроса повторного ввода.

#!usr/bin/python3.11
import subprocess
from sys import executable

dev = int(input('Выбирете производителя: Gigabyte(1) или ASUS(2): '))#Выбор девелопера.
if dev == 1:
        loc = int(input('Выбирете режим: Локально(1) или удалённо(2): '))
elif dev == 2: #Асуса нет
        print ('Данный функционал на данный момент не реализован')
        quit()

def data():
    while True:
        inpt = input()
        if chk(inpt):
            confirm = input(f"{inpt} - давнные верны? (y/n)?")
            if confirm.lower() == 'y':
                return inpt
        print ('Повторите ввод')
    
def multifru_net(): #Функция обновления полей(удаленно) при наличии двух FRU на сервере
    #CPN = str(input('Модель шасси (производителя): '))#
    CPN = data('Модель шасси (производителя): ')
    CSN = str(input('Серийник шасси: '))
    PN = str(input('Имя сервера: '))
    PPN = str(input('Парт номер(ТИС): '))
    PSN = str(input('Серийный номер(ТИС): '))
    PAT = str(input('Asset tag: '))
    processCPN_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'c', '0', CPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCPN_0.stdout)
    processCSN_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'c', '1', CSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCSN_0.stdout)
    processPN_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'p', '1', PN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPN_0.stdout)
    processPPN_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'p', '2', PPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPPN_0.stdout)
    processPSN_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'p', '4', PSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPSN_0.stdout)
    processPAT_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'p', '5', PAT], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPAT_0.stdout)
    processCPN_1 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '1', 'field', 'c', '0', CPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCPN_1.stdout)
    processCSN_1 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '1', 'field', 'c', '1', CSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCSN_1.stdout)
    processPN_1 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '1', 'field', 'p', '1', PN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPN_1.stdout)
    processPPN_1 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '1', 'field', 'p', '2', PPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPPN_1.stdout)
    processPSN_1 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '1', 'field', 'p', '4', PSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPSN_1.stdout)
    processPAT_1 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '1', 'field', 'p', '5', PAT], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPAT_1.stdout)
    frulist = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'list'], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')# Команда вывода общего списка заполненных полей
    print(frulist.stdout)
    checkback = input('Всё верно?(y/n): ')#Подтверждение правильности ввода.
    if checkback == 'n':
       process = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'shell'])
    else:
       print('Обновление завершено. Произведите сброс питания и убедитесь в фиксации заданных параметров!')
       quit()
       
def siglefru_net():#Функция обновления полей(удалённо) при наличии одного FRU на сервере
    CPN = str(input('Модель шасси (производителя): '))
    CSN = str(input('Серийник шасси: '))
    PN = str(input('Имя сервера: '))
    PPN = str(input('Парт номер(ТИС): '))
    PSN = str(input('Серийный номер(ТИС): '))
    PAT = str(input('Asset tag: '))
    processCPN_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'c', '0', CPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCPN_0.stdout)
    processCSN_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'c', '1', CSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCSN_0.stdout)
    processPN_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'p', '1', PN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPN_0.stdout)
    processPPN_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'p', '2', PPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPPN_0.stdout)
    processPSN_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'p', '4', PSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPSN_0.stdout)
    processPAT_0 = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'edit', '0', 'field', 'p', '5', PAT], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPAT_0.stdout)
    frulist = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'fru', 'list'], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')# Команда вывода общего списка заполненных полей
    print(frulist.stdout)
    checkback = input('Всё верно?(y/n): ')#Подтверждение правильности ввода.
    if checkback == 'n':
       process = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'shell'])
    else:
       print('Обновление завершено. Произведите сброс питания и убедитесь в фиксации заданных параметров!')
       quit()

def multifru_local(): #Функция обновления полей(локально) полей при наличии двух FRU на сервере
    CPN = str(input('Модель шасси (производителя): '))
    CSN = str(input('Серийник шасси: '))
    PN = str(input('Имя сервера: '))
    PPN = str(input('Парт номер(ТИС): '))
    PSN = str(input('Серийный номер(ТИС): '))
    PAT = str(input('Asset tag: '))
    processCPN_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'c', '0', CPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCPN_0.stdout)
    processCSN_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'c', '1', CSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCSN_0.stdout)
    processPN_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'p', '1', PN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPN_0.stdout)
    processPPN_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'p', '2', PPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPPN_0.stdout)
    processPSN_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'p', '4', PSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPSN_0.stdout)
    processPAT_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'p', '5', PAT], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPAT_0.stdout)
    processCPN_1 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '1', 'field', 'c', '0', CPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCPN_1.stdout)
    processCSN_1 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '1', 'field', 'c', '1', CSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCSN_1.stdout)
    processPN_1 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '1', 'field', 'p', '1', PN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPN_1.stdout)
    processPPN_1 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '1', 'field', 'p', '2', PPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPPN_1.stdout)
    processPSN_1 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '1', 'field', 'p', '4', PSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPSN_1.stdout)
    processPAT_1 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '1', 'field', 'p', '5', PAT], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPAT_1.stdout)
    frulist = subprocess.run(['/usr/bin/ipmitool', 'fru', 'list'], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')# Команда вывода общего списка заполненных полей
    print(frulist.stdout)
    checkback = input('Всё верно?(y/n): ')#Подтверждение правильности ввода.
    if checkback == 'n':
       process = subprocess.run(['/usr/bin/ipmitool', 'shell'])
    else:
       print('Обновление завершено. Произведите сброс питания и убедитесь в фиксации заданных параметров!')
       quit()
       
def siglefru_local():#Функция обновления полей(локально) при наличии одного FRU на сервере
    CPN = str(input('Модель шасси (производителя): '))
    CSN = str(input('Серийник шасси: '))
    PN = str(input('Имя сервера: '))
    PPN = str(input('Парт номер(ТИС): '))
    PSN = str(input('Серийный номер(ТИС): '))
    PAT = str(input('Asset tag: '))
    processCPN_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'c', '0', CPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCPN_0.stdout)
    processCSN_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'c', '1', CSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processCSN_0.stdout)
    processPN_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'p', '1', PN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPN_0.stdout)
    processPPN_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'p', '2', PPN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPPN_0.stdout)
    processPSN_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'p', '4', PSN], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPSN_0.stdout)
    processPAT_0 = subprocess.run(['/usr/bin/ipmitool', 'fru', 'edit', '0', 'field', 'p', '5', PAT], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
    print(processPAT_0.stdout)
    frulist = subprocess.run(['/usr/bin/ipmitool', 'fru', 'list'], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')# Команда вывода общего списка заполненных полей
    print(frulist.stdout)
    checkback = input('Всё верно?(y/n): ')#Подтверждение правильности ввода.
    if checkback == 'n':
       process = subprocess.run(['/usr/bin/ipmitool', 'shell'])
    else:
       print('Обновление завершено. Произведите сброс питания и убедитесь в фиксации заданных параметров!')
       quit()
       
def local_srv(): #Функция локального обновления FRU
    com = str(input('Шьём весь FRU (y/n): '))
    if com == ('n'):
        process = subprocess.run(['/usr/bin/ipmitool', 'shell'])
    elif com == ('y'):
        frucount = int(input('Количество FRU на сервере: '))
    if frucount == 1:
        singlefru_local()
    elif frucount == 2:
        multifru_local()
    else:
        print ('Введено недопустимое значение')
        return
            
def remote_srv(): #Функция удалённого обновления FRU
    com = str(input('Шьём весь FRU (y/n): '))
    if com == ('n'):
        process = subprocess.run(['/usr/bin/ipmitool', '-I', 'lanplus', '-H', ip, '-U',login, '-P', pwd, 'shell'])
    elif com == ('y'):
        frucount = int(input('Количество FRU на сервере: '))
    if frucount == 1:
        singlefru_net()
    elif frucount == 2:
        multifru_net()
    else:
        print ('Введено недопустимое значение')
        return
            
if loc == 2:
    ip = str(input('введите IP сервера: '))
    login = str(input('Введите логин: '))
    pwd = str(input('Введите пароль: '))
    remote_srv()
    
elif loc == 1:
    login = str(input('Введите логин: '))
    pwd = str(input('Введите пароль: '))
    local_srv()

Хотелось бы понять, что именно приводит к вылету скрипта. Так как без этой функции он работает нормально - я подозреваю, что проблема где-то в том, как она вызывается.

Добавляю трейсбэк:

Выбирете производителя: Gigabyte(1) или ASUS(2): 1
Выбирете режим: Локально(1) или удалённо(2): 2
введите IP сервера: 192.168.1.253
Введите логин: admin
Введите пароль: Qwerty12345!
Шьём весь FRU (y/n): y
Количество FRU на сервере: 2
Traceback (most recent call last):
  File "/home/user/ipmifru-rep/./ipmifru.py", line 190, in <module>
    remote_srv()
  File "/home/user/ipmifru-rep/./ipmifru.py", line 181, in remote_srv
    multifru_net()
  File "/home/user/ipmifru-rep/./ipmifru.py", line 23, in multifru_net
    CPN = data('Модель шасси (производителя): ')
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: data() missing 1 required positional argument: 'chk'

Если я правильно понял, я где-то упустил переменную функции "data"

Ответы

▲ 0

Всем, кто принял участие, большое спасибо за то, что помогли найти вектор. Код было необходимо переписать следующим образом:

def data():
while True:
    resp = input()
    if resp: #убираем из конструкта переменную chk
        confirm = input(f"{resp} - давнные верны? (y/n)?") 
        if confirm.lower() == 'y':
            return resp
    print ('Повторите ввод')
def multifru_net(): #Функция обновления полей(удаленно) при наличии двух FRU на сервере
print ('Модель шасси (производителя): ') #Вместо попыток обозначить что нужно ввести в переменной - просто выводим перед её инициализацией.
CPN = data()