Python скрипт, который принимает аргументы, введенные в оболочку, приходит с ошибкой - PullRequest
0 голосов
/ 19 апреля 2020

Я разрабатываю скрипт для автоматизации mysql создания базы данных и пользователя базы данных. Он принимает аргументы -o -dp -dr, введенные в оболочку, создает скрипт sql со следующими аргументами (-o и -dp) и выполняет этот скрипт с паролем root (-dr)

from sys import argv
from os import makedirs,system
etc = '/mnt/storage/'
def show_usage():
    print("""
        Create new DB and DB user
        -o object_name
        -dp db user password
        -dr mysql root user password
        """)
    exit(1)

def create_template(object_name, password):
    out = """
            %s template %s example %s %s %s %s
           """%(object_name,object_name,password,object_name,object_name)
    return out

def write_to_sql(object_name, db_password):
    sql_script = open(etc+'new_db_and_user.sql','w+')
    script_to_write = create_template(object_name,db_password)
    sql_script.write(script_to_write)

def execute_sql_script(root_password):
    run_sql_script = "mysql --username=root --password=%s < new_db_and_user.sql"%(root_password)
    remove_sql_script = "rm -f new_db_and_user.sql"
    system(run_sql_script)
    system(remove_sql_script)

try:
    opts, args = getopt.getopt(argv[1:], "hd:s:", ["object_name=","db_password=", "root_password="])
except getopt.GetoptError as err:
    print(str(err))

if opts.__len__() == 0:
    show_usage()

object_name=None
password=None
root_password=None

for option, value in opts:
    if option in ('-o', '--object_name'):
        object_name = value
    elif option in ('-dp', '--db_password'):
        password = value
    elif option in ('-dr', '--root_password'):
        root_password = value
    else:
        print("Unknown parameter used")
        show_usage()


write_to_sql(object_name,password)
execute_sql_script(root_password)

Проблема

Когда я выполняю этот скрипт с помощью следующей команды

python create_db.py -o test -dp papa -dr nana

Я получаю сообщение об ошибке:

option -o not recognized
Traceback (most recent call last):
  File "create_db.py", line 43, in <module>
    if opts.__len__() == 0:
NameError: name 'opts' is not defined

Не могли бы вы мне помочь?

1 Ответ

1 голос
/ 19 апреля 2020

Когда вы получили это на выходе,

option -o not recognized

Это означает, что эта строка

opts, args = getopt.getopt(argv[1:], "hd:s:", ["object_name=","db_password=", "root_password="])

не выполнена. Таким образом, выполнение переходит к обработчику исключений

except getopt.GetoptError as err:
    print(str(err))

Поэтому переменная opts вообще не создается.

Вы можете легко исправить это, предварительно определив переменную перед opts, args = ... линия. например,

try:
    opts = []  # Define the variable opts
    opts, args = getopt.getopt(argv[1:], "hd:s:", ["object_name=","db_password=", "root_password="])
except getopt.GetoptError as err:
    print(str(err))
...