背景信息
我正在编写一个python脚本,该脚本将包含一组将通过命令行触发的方法。大多数函数将接受一个或两个参数。
问题
我一直在阅读有关ArgumentParser的信息,但是我不清楚如何编写代码,以便可以使用“-”或“-”表示法来触发函数,并且还要确保if / when调用特定功能后,用户将传递正确数量的参数和类型。
代码
脚本中的示例函数:
def restore_db_dump(dump, dest_db):
"""restore src (dumpfile) to dest (name of database)"""
popen = subprocess.Popen(['psql', '-U', 'postgres', '-c', 'CREATE DATABASE ' + dest_db], stdout=subprocess.PIPE, universal_newlines=True)
print popen.communicate()
popen.stdout.close()
popen.wait()
popen = subprocess.Popen(['pg_restore','-U', 'postgres', '-j', '2', '-d', 'provisioning', '/tmp/'+ dump + '.sql' ], stdout=subprocess.PIPE, u
niversal_newlines=True)
print popen.communicate()
popen.stdout.close()
popen.wait()
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-r', '--restore', dest='restoredbname',action='store_const', const=restore_dump, help='Restore specified dump file as dbname. Must supply <pathtodumpfile> and <dbname>')
args = parser.parse_args()
if __name__ == '__main__':
main()
代码执行
如下所示,帮助系统似乎正在运行,但是我不知道如何编写逻辑来强制/检查是否触发了“ restore_dump”,用户正在传递正确的参数:
lab-1:/tmp# ./test-db.py -h
usage: test-db.py [-h] [-r]
optional arguments:
-h, --help show this help message and exit
-r, --restore Restore specified dump file as dbname. Must supply
<pathtodumpfile> and <dbname>
问题
有人能为我指出正确的方向,如何添加逻辑来检查何时调用restore_db_dump文件,传递正确数量的参数吗?
至于如何“链接” -r参数以触发正确的功能,我在这里看到了另一篇关于stackoverflow的文章,因此我将对其进行检查。
谢谢。
编辑1:
我忘了提到我目前正在阅读:https://docs.python.org/2.7/library/argparse.html-15.4.1。例
但是我不清楚如何将其应用于我的代码。似乎在使用sum函数的情况下,参数的顺序首先是整数,然后是函数名称。
就我而言,我想先获取函数名称(作为可选的arg),然后再获取函数所需的参数。)
编辑2:
将代码更改如下:
def main():
parser = argparse.ArgumentParser()
parse = argparse.ArgumentParser(prog='test-db.py')
parser.add_argument('-r', '--restore', nargs=2, help='Restore specified dump file as dbname. Must supply <pathtodumpfile> and <dbname>')
args = parser.parse_args()
if args.restore:
restore_db_dump(args.restore[0], args.restore[1])
if __name__ == '__main__':
main()
当我在缺少一个arg的情况下运行它时,它现在正确返回错误!哪个很棒!!! 但是我想知道如何解决该帮助,使其更有意义。似乎对于每个参数,系统都显示单词“ RESTORE”。我如何更改它以使其实际上是有用的消息?
lab-1:/tmp# ./test-db.py -h
usage: test-db.py [-h] [-r RESTORE RESTORE]
optional arguments:
-h, --help show this help message and exit
-r RESTORE RESTORE, --restore RESTORE RESTORE
Restore specified dump file as dbname. Must supply
<pathtodumpfile> and <dbname>
答案 0 :(得分:2)
尝试以下操作:
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-r', '--restore', nargs=2,
metavar=('path-to-dump-file', 'db-name'),
help='Restore specified dump file as dbname. Must supply <pathtodumpfile> and <dbname>')
args = parser.parse_args()
if args.restore:
restore_db_dump(args.restore[0], args.restore[1])
if __name__ == '__main__':
main()
注意:
const=
,因为不清楚您是否要使用默认值。nargs=2
参数,因此-r
选项需要提供两个值。metavar
参数在帮助文本中将参数名称设置为-r
。