Проблема Python с if-elif-else и / или проблема сравнения строк

#python #python-3.x #if-statement #exception

#python #python-3.x #if-оператор #исключение

Вопрос:

Я новичок в Python (и stackoverflow : D), и в школе мы получили задание создавать (обычных пользователей и с правами sudo) и удалять пользователей в системе Linux (Ubuntu 18.04 в моем случае). Я использую Pycharm для кодирования и Python 3.7 в качестве интерпретатора. Я уже искал ответ, но не смог его найти. Итак, я не уверен, что именно вызывает эти проблемы, поэтому извините за, возможно, сбивающий с толку заголовок. Я постараюсь объяснить это как можно лучше.

Я хочу задать вопрос, хочет ли пользователь создать или удалить пользователя..

 def useradministration():
    parameters.question_user ##input("User add (a) or delete (d)?: ").strip() 
  

… далее следует:

 #a for adding an user
if parameters.question_user == 'a':
   def usercreate():
      parameters.question_role ##input("Role for the user: administrator (a) or normal user (n)? ").strip()
      # n for normal user - creating via useradd
      if parameters.question_role == 'n':
        .....
      # a for administrator - same as a but with usermod for sudo
      elif parameters.question_role == 'a':
        .....
      #error if its neither n or a
      else:
         print("Error: wrong specification for role.")
   usercreate()
#d for deleting an user
elif parameters.question_user == 'd':
   def userdelete():
      ........
#error if its neither a or d
else:
   print("Error: wrong specification for user.")
  

Первый вопрос.
Пример вывода:

 User add (a) or delete (d)?: r
Role for the user: administrator (a) or normal user (n)? u
Select username:g
Error: wrong specification for user.
  

Это выдает правильный вывод с «Ошибка: неправильная спецификация для пользователя». — но почему он все еще отвечает на все вопросы, если первое if неверно? Это проблема с моим скриптом, или сравнение входных данных не работает, или что-то еще?

 User add (a) or delete (d)?: r
Error: wrong specification for user.
  

Это был бы результат, на который я надеялся.


Еще один вопрос по части удаления. Мы должны записать все в файл. Мое пользовательское удаление выглядит следующим образом:

      def userdelete():
        parameters.username ##username = input("Select username:")
        #try to delete if it exists, print and log it
        try:
            os.system("sudo userdel -r "   parameters.username)
            print("User "   parameters.username   " deleted.")
            logging.info("User "   parameters.username   " deleted.")
        #exception for when user doesn't exist, just printing and logging it
        except OSError:
            print("User "   parameters.username   " doesnt exist.")
            logging.critical("User "   parameters.username   " doesnt exist.")
            pass

    userdelete()
  

Пример вывода:

 User add (a) or delete (d)?: d
Role for the user: administrator (a) or normal user (n)? o
Select username:abc
User abc deleted.
userdel: user 'abc' does not exist
  

Скрипт фактически удаляет пользователя, если он существует.
Но почему он задает вопрос о роли и почему он не использует оператор except, если пользователь не существует (потому что abc не существует)? Я неправильно использую это в этом случае?

Я надеюсь, что кто-нибудь сможет мне помочь.

Спасибо.


РЕДАКТИРОВАТЬ параметры.question_user из другого файла .py, вызываемого parameters.py (Я импортировал это в main.py файл) и просто содержит

 question_user = input("User add (a) or delete (d)?: ").strip()
question_role = input("Role for the user: administrator (a) or normal user (n)? ").strip()
username = input("Select username:")
  

Комментарии:

1. Почему вы определяете функции внутри своих if/then операторов? Функции обычно определяются на верхнем уровне.

2. Что вы устанавливаете parameters.question_user ?

3. Почему у вас есть ## где должно быть = назначение переменных?

4. Опубликованный вами код не может быть фактическим кодом, который вы выполняете. Таким образом, мы не можем сказать, что происходит не так в реальном коде.

5. @Barmar Я новичок, как я уже сказал, и думал, что это может работать следующим образом. Исправлю это впоследствии! — question_user находится в parameters.py вот где я это установил, и я, конечно, импортировал его в основной файл через «параметры импорта» вверху