如何在实际脚本中使用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
参数是一个位置参数,它需要一个字符串。相比之下,-p
和 nargs='?'
是一个可选的标记参数,它允许我说明的三路输入。
parser.add_argument("echo")
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
参数是一个位置参数,它需要一个字符串。相比之下,-p
和 nargs='?'
是一个可选的标记参数,它允许我说明的三路输入。
parser.add_argument("echo")