1

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

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 databasepassword并将第 2 行的部分替换为

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 接受的答案以及对该答案的评论。

4

2 回答 2

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参数是一个位置参数,它需要一个字符串。相比之下,-pwithnargs='?'是一个可选的标记参数,它允许我说明的三向输入。

parser.add_argument("echo")
于 2017-06-15T16:23:45.837 回答
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。这工作得很好。

于 2017-06-15T16:05:00.673 回答