【发布时间】:2015-11-04 01:14:42
【问题描述】:
对使用 argparse 和 cmd 行非常陌生。我已经开始构建一个解析器,它允许前端用户通过 cmd 终端输入数据。解析器正在调用我创建的 API() 类(创建 SQLALCHEMY 会话等),此处显示的示例:
class API(object):
def __init__(self):
# all the session / engine config here
def create_user(self, username, password, firstname, lastname, email):
new_user = User(username, password, firstname, lastname, email)
self.session.add(new_user)
self.session.commit()
print(username, firstname, lastname)
def retrieve_user(self, username, firstname, lastname):
# code here ... etc .
在此处的 CMD 文件中实现:
def main():
parser = argparse.ArgumentParser(prog='API_ArgParse', description='Create, Read, Update, and Delete (CRUD) Interface Commands')
subparsers = parser.add_subparsers(
title='subcommands', description='valid subcommands', help='additional help')
api = API() # calling the API class functions/engine
# Create command for 'user'
create_parser = subparsers.add_parser('create_user', help='create a user')
create_parser.add_argument('username', type=str, help='username of the user')
create_parser.add_argument('password', type=str, help='password')
create_parser.add_argument('firstname', type=str, help='first name')
create_parser.add_argument('lastname', type=str, help='last name')
create_parser.add_argument('email', type=str, help='email address')
#args = parser.parse_args() <--EDIT:removed from here and placed on bottom
api.create_user(args.username, args.password, args.firstname, args.lastname, args.email)
# Retrieve command for 'user'
retrieve_parser = subparsers.add_parser('retrieve_user', help='retrieve a user')
retrieve_parser.add_argument('username', type=str, help='username')
retrieve_parser.add_argument('firstname', type=str, help='first name')
retrieve_parser.add_argument('lastname', type=str, help='last name')
api.retrieve_user(args.username, args.firstname, args.lastname)
NEW EDIT/ADDITION OF args = parser.parse_args() 使用这两个命令来反映下面的 cmets。
args = parser.parse_args()
print(args)
if __name__ == '__main__':
main()
等等……
我的问题是终端没有打印新解析器的帮助命令(例如,retrieve_parser、update_parser 等)。我是否必须为每个部分创建一个“args = parser.parse_arg()”? 其次,我是否创建一个“args = create_parser.parse_args()”来代替“parser.parse ...”我注意到他们在终端上打印了两个不同的东西。
非常感谢任何关于放置 parse_arg() 方法的说明(考虑到 API() 函数的使用)!
【问题讨论】:
-
尝试从终端调用retrieve_user 时,出现以下错误:
usage: API_ArgParse [-h] {create_user} ... API_ArgParse: error: invalid choice: 'retrieve_user' (choose from 'create_user') -
第一次调用
parse_args,你定义的就是create_user。这就是错误消息告诉您的内容。在创建所有子解析器后放置parse_args。 -
我把
args = parser.parse_args()放在最后(在我所有的子解析器之后),现在我得到Traceback (most recent call last): File "/usr/local/bin/notssdb-cmd", line 57, in <module> main() File "/usr/local/bin/notssdb-cmd", line 25, in main api.create_user(args.username, args.password, args.firstname, args.lastname, args.email) UnboundLocalError: local variable 'args' referenced before assignment,这是有道理的,因为现在在底部定义了args。我会用适当的标记来反映这一点,以便完成编辑。 -
也许这是一个我应该构建 IF/ELIF/ELIF 语句的实例,以便解析器遍历命令直到匹配正确的命令。
标签: python-2.7 command-line-arguments argparse