如何在实际脚本

时间:2017-06-15 15:22:42

标签: python-3.x psycopg2 argparse getpass

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

#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)来隐藏我的密码?我发现了关于这个主题的这个脚本几次(我会在它开始工作后删除print语句):

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)

我尝试在argparse代码上方添加#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下面接受的答案以及对该答案的评论。

2 个答案:

答案 0 :(得分:1)

此解析器为用户提供了两种输入密码的方法,在命令行上或单独的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")

答案 1 :(得分: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。这很好用。