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
代码段。并用
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 :(得分: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
参数是位置参数,需要一个字符串。相比之下-p
和nargs='?'
是一个可选的标记参数,它允许我说明的三向输入。
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
。这很好用。