Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在实际脚本中使用argparse_Python 3.x_Psycopg2_Argparse_Getpass - Fatal编程技术网

Python 3.x 如何在实际脚本中使用argparse

Python 3.x 如何在实际脚本中使用argparse,python-3.x,psycopg2,argparse,getpass,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'" #

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语句后删除它):

我试图将
argparse
片段添加到
#Connect to database
代码上方。并将第2行的密码部分替换为

conn_string =
    "host='my_aws_postgresql_database.rds.amazonaws.com'
    dbname='my_database_name'
    user='my_username'
    password='" + args + "'"
然后,我尝试使用命令
python3 my_script\u file.py my_password-p运行整个脚本,我被要求输入密码,但这导致了以下错误

usage: Test password parser [-h] [-p [PASSWORD]]
Test password parser: error: unrecognized arguments: my_password
如果我使用
python3 my_script\u file.py my_password
我会收到相同的错误,但我不必(再次)输入密码

我接近解决方案了吗?这是做这件事的标准方法吗


问题是我使用了
python3 my_script\u file.py my_password-p
而不是正确的顺序
python3 my_script\u file.py-p my_password
,请参见下面@hpaulj接受的答案和对该答案的评论。

谢谢@CarlShiles,您的答案与上面的长argparse/getpass片段不符,但这让我意识到我可以
回显那里的密码。所以我做了一个简单的

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()

然后使用您的建议,
password='“+args.echo+”
。然后运行以下命令
python3 my\u script\u file.py my\u password
。这很好。

此解析器为用户提供了两种输入密码的方式,在命令行上,或使用单独的
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\u file.py-p my_password
产生了一个错误;我最好的猜测是您的解析器定义中有一个输入错误(nargs
有问题)

目前还不完全清楚您是如何将此解析器代码合并到更大的脚本中的。如果操作正确,则不应更改解析器的行为

密码参数将用作:

password='" + args.password + "'"
echo
参数是一个位置参数,它需要一个字符串。与
nargs='?'
相比,
-p
是一个可选的标记参数,它允许我所示的三向输入

parser.add_argument("echo")

密码通常来自Windows上的文件%AppData%\Roaming\Postgresql\pgpass.conf您似乎正在路上,您只是在“隐藏”密码,每次用户使用该程序时都强制用户输入密码,而不是硬编码。当出现错误时,您需要指定所需的参数,而不是使用整个列表。
password='“+args+”
应该是
password='“+args.password+”“
我不明白你想做什么。添加参数(“echo”)只需添加一个名为echo的附加参数。错误由解析器本身产生。如果没有
-p
,它就不会调用
密码
操作,只剩下一个字符串,它不知道如何处理(没有像您的
echo
那样的
positional
参数。使用
-p
is调用该操作,但我不明白为什么它没有将嵌套字符串也传递给该操作。@Drako我使用的是Mac。但是您会说我应该将密码存储在一个*.conf文件中,然后让getpass库访问它?或者您是什么确切地说?非常感谢您的澄清。我再次使用您的命令运行了唯一的argparse脚本,并获得了相同的结果。我感到困惑,因此尝试使用该命令再次运行我的脚本
python3 my_script_file.py-p my_password
,然后它使用
args.password
。因此再次感到困惑,并且检查了我以前的命令,发现我使用了
python3 my_script\u file.py my_password-p
。这一定是我的错误。我是新手。我是否应该更改我的问题以反映我实际使用的和错误的命令?继续编辑你的问题。是的,相反的顺序将解释错误。处理t需要
-p
他把下一根绳子系好了。
parser.add_argument("echo")