如何在实际脚本中使用argparse

How to use argparse in the actual script

argparse 是如何工作的?我被告知 'hide' 我正在建立的 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)

我尝试在 #Connect to database 代码上方添加 argparse 片段。并将第 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 接受的答案以及对该答案的评论。

谢谢@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。这工作得很好。

此解析器为用户提供了 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)`;使用 'test' 字符串的“-p test”;仅使用“-p”,它会询问;并且没有“-p”,这会产生错误。

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

尚不完全清楚您是如何将此解析器代码合并到更大的脚本中的。做对了,它不应该改变解析器的行为。

密码参数将用作:

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

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

parser.add_argument("echo")