python-3.x
  • psycopg2
  • argparse
  • getpass
  • 2017-06-15 36 views 1 likes 
    1

    argparse如何工作?我被告知要从我正在构建的psycopg2连接'隐藏'密码,以便能够每周自动运行脚本并能够在部门之间共享。这是psycopg2脚本的开始,其中的密码是问:如何在实际脚本中使用argparse

    #Connect to database 
    conn_string = "host='my_aws_postgresql_database.rds.amazonaws.com' dbname='my_database_name' user='my_username' password='my_password'" 
    # print the connection string we will use to connect 
    print ("\"Connecting to database\n ->%s\"" % (conn_string)) 
    

    现在,我会怎么用argparse(和将getpass)隐藏我的密码?我发现这个脚本有关此主题几次(我会得到它的工作后,删除打印语句):

    import argparse 
    import getpass 
    
    class Password(argparse.Action): 
        def __call__(self, parser, namespace, values, option_string): 
         if values is None: 
          values = getpass.getpass() 
         setattr(namespace, self.dest, values) 
    
    parser = argparse.ArgumentParser('Test password parser') 
    parser.add_argument('-p', action=Password, nargs='?', dest='password', 
    help='Enter your password') 
    args = parser.parse_args() 
    print (args.password) 
    

    我试图添加#Connect to database代码上面的​​片段。来代替在第2行password部分与

    conn_string = 
        "host='my_aws_postgresql_database.rds.amazonaws.com' 
        dbname='my_database_name' 
        user='my_username' 
        password='" + args + "'" 
    

    然后我试着用命令python3 my_script_file.py my_password -p有人问我为我输入密码运行整个脚本,但这呈现以下错误

    usage: Test password parser [-h] [-p [PASSWORD]] 
    Test password parser: error: unrecognized arguments: my_password 
    

    如果我使用python3 my_script_file.py my_password,我得到相同的错误,但我不必再次输入密码。

    我接近解决方案吗?这是做这件事的标准方式吗?

    问题是我用python3 my_script_file.py my_password -p而不是正确的顺序python3 my_script_file.py -p my_password,请参阅@hpaulj以下的接受答案和对该答案的评论。

    +0

    密码normaly来自文件%APPDATA%\上 – Drako

    +1

    你似乎对你的方式,你只是通过强制用户输入其每个“隐藏”密码Windows漫游\ PostgreSQL的\ pgpass.conf他们使用该程序的时间,而不是硬编码。当涉及到你的错误时,你需要指定你想要的参数,而不是使用整个列表。
    'password ='“+ args +”'“'应该是'password ='”+ args.password +“'”' –

    +0

    我不明白你要做什么。 add_argument(“echo”)只是添加了一个名为echo的附加参数。 –

    回答

    1

    这个解析器是为用户提供了2种方式输入密码的,在命令行上,或者用一个单独的getpass提示:

    import argparse 
    import getpass  
    class Password(argparse.Action): 
        def __call__(self, parser, namespace, values, option_string): 
         if values is None: 
          values = getpass.getpass() 
         setattr(namespace, self.dest, values) 
    
    parser = argparse.ArgumentParser('Test password parser') 
    parser.add_argument('-p', action=Password, nargs='?', dest='password', 
    help='Enter your password') 
    args = parser.parse_args() 
    print (args) 
    

    样品运行:

    0911:~/mypy$ python3 stack44571340.py 
    Namespace(password=None) 
    0912:~/mypy$ python3 stack44571340.py -p test 
    Namespace(password='test') 
    0912:~/mypy$ python3 stack44571340.py -p 
    Password: 
    Namespace(password='testing') 
    0912:~/mypy$ python3 stack44571340.py test 
    usage: Test password parser [-h] [-p [PASSWORD]] 
    Test password parser: error: unrecognized arguments: test 
    

    我没有任何参数测试(获得默认None)`; '-p test'使用'test'字符串;只有'-p',其中要求;并且没有'-p',这会产生错误。

    我不知道为什么python3 my_script_file.py -p my_password产生错误;我最好的猜测是你的解析器定义中有一个错字(nargs错误?)。

    如何将此解析器代码合并到较大的脚本中并不完全清楚。完成它不应该改变解析器的行为。

    密码参数将被用作:

    password='" + args.password + "'" 
    

    echo的说法,是位置之一,这需要一个字符串。相比之下,-pnargs='?',是一个可选的标记参数,它允许我说明的三路输入。

    parser.add_argument("echo") 
    
    +0

    非常感谢你的澄清,我重新运行唯一的argparse脚本再次和你的命令一样,并得到相同的结果。我很困惑,所以尝试命令再次运行我的脚本'python3 my_script_file.py -p my_password',然后它与'args.password'一起工作,所以再次困惑,并检查了我以前的命令,看到我做了'python3 my_script_file.py my_password -p'。这一定是我的错误。 – ccasimiro9444

    +0

    我对此很陌生。我应该改变我的问题,以反映我使用的实际和错误的命令吗? – ccasimiro9444

    +0

    继续并编辑您的问题。是的,颠倒的顺序可以解释错误。 '-p'是正确处理下一个字符串所必需的。 – hpaulj

    0

    谢谢@CarlShiles,你的回答并不适用于上面那个冗长的argparse/getpass片段,但它让我意识到我可以在那里输入密码echo。所以我做了一个简单的

    import argparse 
    parser = argparse.ArgumentParser() 
    parser.add_argument("echo") 
    args = parser.parse_args() 
    

    然后用你的建议,password='" + args.echo + "'"。然后运行以下命令python3 my_script_file.py my_password。这工作得很好。

    相关问题