Найти - Пользователи
Полная версия: в чем ошибка в скрипте?
Начало » Центр помощи » в чем ошибка в скрипте?
1 2
temzza
Хочу спросить на счет данной ошибки, из за чего она возникает, его я ошибся или совсем что то не верно(что скорее всего). Суть задачи скрипта = есть конфиг, в него надо вносить изменения пользователем через input. Нужно чтобы была проверка на параметры в которых только путь до папки, и только да\нет можно написать (+ еще скорее всего надо для параметров только с цифрами сделать проверку, но я пока незнаю как, если будет оказана помощь еще и в этом, буду очень благодарен). Дак вот я сделал функция на проверку имеется ли папка в системе, создал словарь со всеми параметрами и их значениями (если делать только для проверки папки, все работает хорошо, проблема именно в параметрами да\нет). Вот собственно говоря суть проблемы, спасибо заранее добрым людям которые помогут) Скриншот конфига и сам код скрипта приложены с посту.
 # -*- coding: utf-8 -*-
import os
path = '/test3.conf'
name1 = input('what setting you to change? ')
value1 = input('what you want to change in this setting: ')
def set_parametrs(name1, value1):
    with open(path) as f:
        current_config = f.read().splitlines()
    for i, option in enumerate(current_config):
        if option.split("=")[0].strip() == name1:
            current_config[i] = '%s = %s' % (name1, value1)
    with open(path, 'w') as f:
        f.write('\n'.join(current_config))
        f.close()
def check_dir():
    if os.path.isdir(value1):
        print('we have this dir')
        return True
    else:
        print('we dont have this dir')
        return False
def check_yes_no():
    for key, value in d.items():
        if name1 == key and value1 in d[key]:
            print('this parametr is valid')
            return True
    else:
        print('this parametr is invalid')
    return False
d = {
    'backup_destination_automake': ('yes', 'no'),
    'backup_destination_prefix': ('yes', 'no'),
    'backup_schedule': ('yes', 'no'),
    'backup_keep_on_errors': ('yes', 'no'),
    'method_rsync_sudo': ('yes', 'no'),
    'method_rsync_differential': ('yes', 'no'),
    'method_verify': ('yes', 'no'),
    'method_device_eject': ('yes', 'no'),
    'report_remote_uri_down': ('yes', 'no'),
    'report_stdout': ('yes', 'no'),
    'report_stdout_on_errors': ('yes', 'no'),
    'report_email': ('yes', 'no'),
    'report_email_on_errors': ('yes', 'no'),
    'report_email_rcpt': ('yes', 'no'),
    'report_html': ('yes', 'no'),
    'report_html_on_errors': ('yes', 'no'),
    'report_html_logo': ('yes', 'no'),
    'backup_source': check_dir,
    'backup_destination': check_dir,
    'backup_exclude': check_dir
}
'''param_dir = {
    'backup_source': check_dir,
    'backup_destination': check_dir,
    'backup_exclude': check_dir
}'''
if name1 and value1 and d[name1]:
    set_parametrs(name1, value1)
elif check_yes_no:
    set_parametrs(name1, value1)
else:
        print("bad")/code]
vic57
 if name1 and value1 and d[name1](): # ???
    set_parametrs(name1, value1)
elif check_yes_no:
    set_parametrs(name1, value1)
else:
        print("bad")
 Traceback (most recent call last):
  File "conf3.py", line 55, in <module>
    if name1 and value1 and d[name1]():
NameError: name 'name1' is not defined
а где определяются name1, value1 ?
и еще
 if name1 in d and d[name1] == value1 
temzza
vic57
прощу прощение, начало кода не скопировал
 # -*- coding: utf-8 -*-
import os
path = '/Users/test/test3.conf'
name1 = input('what setting you to change? ')
value1 = input('what you want to change in this setting: ')
temzza
vic57
обновил начальный пост, добавил начало+убрал ()
а эта строчка ->
 if name1 in d and d[name1] == value1 
где именно должна быть? в конечном условии? Просто у меня там стоит
 if name1 and value1
просто чтобы нельзя было пустыми их оставлять, а дальше через and уже остальное
vic57
зачем так?
если ты хочешь изменить параметр то
 d = {
    'backup_destination_automake': ('yes', 'no'),
    'backup_destination_prefix': ('yes', 'no'),
    'backup_schedule': ('yes', 'no'),
    'backup_keep_on_errors': ('yes', 'no'),
    'method_rsync_sudo': ('yes', 'no'),
    'method_rsync_differential': ('yes', 'no'),
    'method_verify': ('yes', 'no'),
    'method_device_eject': ('yes', 'no'),
    'report_remote_uri_down': ('yes', 'no'),
    'report_stdout': ('yes', 'no'),
    'report_stdout_on_errors': ('yes', 'no'),
    'report_email': ('yes', 'no'),
    'report_email_on_errors': ('yes', 'no'),
    'report_email_rcpt': ('yes', 'no'),
    'report_html': ('yes', 'no'),
    'report_html_on_errors': ('yes', 'no'),
    'report_html_logo': ('yes', 'no'),
    'backup_source': check_dir,
    'backup_destination': check_dir,
    'backup_exclude': check_dir
}
'''param_dir = {
    'backup_source': check_dir,
    'backup_destination': check_dir,
    'backup_exclude': check_dir
}'''
for k,v in d.items():
    s = input(k + '|'.join(v) + '  (y/n/q[uit])?:')
    if s == 'y':
        d[k] = 'yes'
    elif s == 'n':
        d[k] = 'no'
    elif s =='q':
        break
    else:
        continue
    
temzza
vic57
зачем так?если ты хочешь изменить параметр то
спасибо за способ) но я хотел уточнить, обязательно чтобы была проверка как когда меняю путь у папки, скрипт проверял что пишет именно путь, и также с да\нет, только да нет, и только для тех вариантов которым надо да нет.
Я может быть не правильно понял, но в вашем варианте я смогу сделать да\нет и у тех параметров которым нужен путь к папке.

p.s спасибо за помощь, буду рад если объясните, может я что то не так понял)
vic57
ну в таком случае раздели проверку параметров типа yes/no и типа path на два разных цикла
в консоли ты просто запутаешься
temzza
vic57
ну в таком случае раздели проверку параметров типа yes/no и типа path на два разных циклав консоли ты просто запутаешься
То что запутаюсь это не слишком страшно, главное задача чтобы работала правильно проверка на правильность указания параметра. Чтобы для одних параметров только да\нет, а для других только путь
vic57
вот и раздели
 d1 = {
    'backup_destination_automake': ('yes', 'no'),
    'backup_destination_prefix': ('yes', 'no'),
    'backup_schedule': ('yes', 'no'),
    'backup_keep_on_errors': ('yes', 'no'),
    'method_rsync_sudo': ('yes', 'no'),
    'method_rsync_differential': ('yes', 'no'),
    'method_verify': ('yes', 'no'),
    'method_device_eject': ('yes', 'no'),
    'report_remote_uri_down': ('yes', 'no'),
    'report_stdout': ('yes', 'no'),
    'report_stdout_on_errors': ('yes', 'no'),
    'report_email': ('yes', 'no'),
    'report_email_on_errors': ('yes', 'no'),
    'report_email_rcpt': ('yes', 'no'),
    'report_html': ('yes', 'no'),
    'report_html_on_errors': ('yes', 'no'),
    'report_html_logo': ('yes', 'no')
}
 d2 = {   
    'backup_source': check_dir,
    'backup_destination': check_dir,
    'backup_exclude': check_dir
}
temzza
vic57
вот и раздели
я пробовал делать с . разделением , но видимо тоже где то накосячил
 # -*- coding: utf-8 -*-
import os
path = '/test3.conf'
name1 = input('what setting you to change? ')
value1 = input('what you want to change in this setting: ')
def set_parametrs(name1, value1):
    with open(path) as f:
        current_config = f.read().splitlines()
    for i, option in enumerate(current_config):
        if option.split("=")[0].strip() == name1:
            current_config[i] = '%s = %s' % (name1, value1)
    with open(path, 'w') as f:
        f.write('\n'.join(current_config))
        f.close()
def check_dir():
    if os.path.isdir(value1):
        print('we have this dir')
        return True
    else:
        print('we dont have this dir')
        return False
d = {
    'backup_destination_automake': ('yes', 'no'),
    'backup_destination_prefix': ('yes', 'no'),
    'backup_schedule': ('yes', 'no'),
    'backup_keep_on_errors': ('yes', 'no'),
    'method_rsync_sudo': ('yes', 'no'),
    'method_rsync_differential': ('yes', 'no'),
    'method_verify': ('yes', 'no'),
    'method_device_eject': ('yes', 'no'),
    'report_remote_uri_down': ('yes', 'no'),
    'report_stdout': ('yes', 'no'),
    'report_stdout_on_errors': ('yes', 'no'),
    'report_email': ('yes', 'no'),
    'report_email_on_errors': ('yes', 'no'),
    'report_html': ('yes', 'no'),
    'report_html_on_errors': ('yes', 'no'),
    'report_html_logo': ('yes', 'no'),
}
param_dir = {
    'backup_source': check_dir,
    'backup_destination': check_dir,
    'backup_exclude': check_dir
}
def check_yes_no():
    for key, value in d.items():
        if name1 == key and value1 in d[key]:
            print('this parametr is valid')
            return True
    else:
        print('this parametr is invalid')
    return False
'''if name1 and value1 and d[name1] == check_dir():
    set_parametrs(name1, value1)
elif check_yes_no():
    set_parametrs(name1, value1)
else:
        print("bad")'''
if name1 and value1 and param_dir[name1]() and name1 in d == check_yes_no():
    set_parametrs(name1, value1)
else:
    print("Bad input")
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB