python-3.x
  • psycopg2
  • argparse
  • getpass
  • 2017-06-15 34 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。這工作得很好。

    相關問題