- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python解析命令行读取参数--argparse模块使用方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在多个文件或者不同语言协同的项目中,python脚本经常需要从命令行直接读取参数。万能的python就自带了argprase包使得这一工作变得简单而规范。PS:optparse包是类似的功能,只不过写起来更麻烦一些.
如果脚本很简单或临时使用,没有多个复杂的参数选项,可以直接利用sys.argv将脚本后的参数依次读取(读进来的默认是字符串格式)。比如如下名为test.py的脚本:
1
2
|
import
sys
print
"Input argument is %s"
%
(sys.argv[
0
])
|
在shell脚本中运行python test.py help可以得到Input argument is help的结果.
1) 一般形式 。
但是大多数情况下,脚本很可能需要多个参数,而且每次参数的类型用处各不相同,那么这个时候在参数前添加标签表明参数的类型和用途便十分有用,而利用argparse模块可以很方便得实现这一目的.
同样用名为test.py的脚本举个栗子:
1
2
3
4
5
6
7
8
9
10
|
import
argparse
parser
=
argparse.ArgumentParser(description
=
"your script description"
)
# description参数可以用于插入描述脚本用途的信息,可以为空
parser.add_argument(
'--verbose'
,
'-v'
, action
=
'store_true'
,
help
=
'verbose mode'
)
# 添加--verbose标签,标签别名可以为-v,这里action的意思是当读取的参数中出现--verbose/-v的时候
# 参数字典的verbose建对应的值为True,而help参数用于描述--verbose参数的用途或意义。
args
=
parser.parse_args()
# 将变量以标签-值的字典形式存入args字典
if
args.verbose:
print
"Verbose mode on!"
else
:
print
"Verbose mode off!"
|
运行python test.py后面跟了--verbose/-v的时候会输出前者,如果什么都没有会输出后者。如果输入了--verbose/-v以外的参数则会报错:unrecognized arguments 稍微提一下,action参数表示值赋予键的方式,这里用到的是bool类型;如果是'count'表示将--verbose标签出现的次数作为verbose的值;'append'表示将每次出现的该便签后的值都存入同一个数组再赋值。(嘛,一般后面两种用的比较少就不多说了) PS:--help标签在使用argparse模块时会自动创建,因此一般情况不需要我们主动定义帮助信息.
1
2
3
4
5
6
7
8
|
$ python test.py
-
-
help
usage: test.py [
-
h] [
-
-
verbose]
your script description
optional arguments:
-
h,
-
-
help
show this
help
message
and
exit
-
-
verbose,
-
v verbose mode
|
2) 必需参数 。
这种模式用于确保某些必需的参数有输入.
parser.add_argument('--verbose', required=True, type=int) 。
required标签就是说--verbose参数是必需的,并且类型为int,输入别的类型会报错.
3)位置参数(positional arguments) 。
位置参数与sys.argv调用比较像,参数没有显式的--xxx或者-xxx标签,因此调用属性也与sys.argv相同.
1
2
3
|
parser.add_argument(
'filename'
)
# 输入的第一个参数赋予名为filename的键
args
=
parser.parse_args()
print
"Read in %s"
%
(args.filename)
|
输入python test.py test.txt则会输出Read in test.txt 。
此外,可以用nargs参数来限定输入的位置参数的个数,默认为1。当然nargs参数也可用于普通带标签的参数。 parser.add_argument('num', nargs=2, type=int)表示脚本可以读入两个整数赋予num键(此时的值为2个整数的数组)。nargs还可以'*'用来表示如果有该位置参数输入的话,之后所有的输入都将作为该位置参数的值;‘+'表示读取至少1个该位置参数。'?'表示该位置参数要么没有,要么就只要一个。(PS:跟正则表达式的符号用途一致。) 。
比如用:
1
2
|
parser.add_argument(
'filename'
)
parser.add_argument(
'num'
, nargs
=
'
*
)
|
就可以运行python test.py text.txt 1 2 。
由于没有标签,所以用位置参数的时候需要比较小心.
4)输入类型 。
之前已经提到了用type参数就可以指定输入的参数类型。而这个type类型还可以表示文件操作的类型从而直接进行文件的读写操作.
1
2
3
4
|
parser.add_argument(
'file'
,
type
=
argparser.FileType(
'r'
))
# 读取文件
args
=
parser.parse_args()
for
line
in
args.
file
:
print
line.strip()
|
5)参数默认值 。
一般情况下会设置一些默认参数从而不需要每次输入某些不需要变动的参数,利用default参数即可实现.
parser.add_argument('filename', default='text.txt') 。
这个时候至直接运行python text.py就能得到Read in text.txt而不需要输入文件名了.
6)候选参数选择 。
表示该参数能接受的值只能来自某几个值候选值中,除此以外会报错,用choices参数即可。比如:
parser.add_argument('filename', choices=['test1.txt', 'text2.txt']) 。
参考:
https://mkaz.tech/python-argparse-cookbook.html 。
https://docs.python.org/2/howto/argparse.html 。
以下是其他网友的补充:
1、简介:
argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块。argparse模块的作用是用于解析命令行参数,例如python parseTest.py input.txt output.txt --user=name --port=8080.
2、使用步骤:
1:import argparse 。
2:parser = argparse.ArgumentParser() 。
3:parser.add_argument() 。
4:parser.parse_args() 。
解释:首先导入该模块;然后创建一个解析对象;然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;最后调用parse_args()方法进行解析;解析成功之后即可使用,下面简单说明一下步骤2和3.
3、方法ArgumentParser(prog=None, usage=None,description=None, epilog=None, parents=[],formatter_class=argparse.HelpFormatter, prefix_chars='-',fromfile_prefix_chars=None, argument_default=None,conflict_handler='error', add_help=True) 。
这些参数都有默认值,当调用parser.print_help()或者运行程序时由于参数不正确(此时python解释器其实也是调用了pring_help()方法)时,会打印这些描述信息,一般只需要传递description参数,如上.
4、方法add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest]) 。
其中:
name or flags:命令行参数名或者选项,如上面的address或者-p,--port.其中命令行参数如果没给定,且没有设置defualt,则出错。但是如果是选项的话,则设置为None 。
nargs:命令行参数的个数,一般使用通配符表示,其中,'?'表示只用一个,'*'表示0到多个,'+'表示至少一个 。
default:默认值 。
type:参数的类型,默认是字符串string类型,还有float、int等类型 。
help:和ArgumentParser方法中的参数作用相似,出现的场合也一致 。
最常用的地方就是这些,其他的可以参考官方文档。下面给出一个例子,基本包括了常见的情形:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
import
argparse
def
parse_args():
description
=
usage:
%
prog [options] poetry
-
file
This
is
the Slow Poetry Server, blocking edition.
Run it like this:
python slowpoetry.py <path
-
to
-
poetry
-
file
>
If you are
in
the base directory of the twisted
-
intro package,
you could run it like this:
python blocking
-
server
/
slowpoetry.py poetry
/
ecstasy.txt
to serve up John Donne's Ecstasy, which I know you want to do.
parser
=
argparse.ArgumentParser(description
=
description)
help
=
The addresses to connect.
parser.add_argument(
'addresses'
,nargs
=
'*'
,
help
=
help
)
help
=
The filename to operate on.Default
is
poetry
/
ecstasy.txt
parser.add_argument(
'filename'
,
help
=
help
)
help
=
The port to listen on. Default to a random available port.
parser.add_argument(
'-p'
,
-
-
port',
type
=
int
,
help
=
help
)
help
=
The interface to listen on. Default
is
localhost.
parser.add_argument(
'--iface'
,
help
=
help
, default
=
'localhost'
)
help
=
The number of seconds between sending bytes.
parser.add_argument(
'--delay'
,
type
=
float
,
help
=
help
, default
=
.
7
)
help
=
The number of bytes to send at a time.
parser.add_argument(
'--bytes'
,
type
=
int
,
help
=
help
, default
=
10
)
args
=
parser.parse_args();
return
args
if
__name__
=
=
'__main__'
:
args
=
parse_args()
for
address
in
args.addresses:
print
'The address is : %s .'
%
address
print
'The filename is : %s .'
%
args.filename
print
'The port is : %d.'
%
args.port
print
'The interface is : %s.'
%
args.iface
print
'The number of seconds between sending bytes : %f'
%
args.delay
print
'The number of bytes to send at a time : %d.'
%
args.bytes<
/
path
-
to
-
poetry
-
file
>
|
运行该脚本:python test.py --port 10000 --delay 1.2 127.0.0.1 172.16.55.67 poetry/ecstasy.txt 。
输出为:
The address is : 127.0.0.1 . The address is : 172.16.55.67 . The filename is : poetry/ecstasy.txt . The port is : 10000. The interface is : localhost. The number of seconds between sending bytes : 1.200000 The number of bytes to send at a time : 10. 。
原文链接:https://www.cnblogs.com/arkenstone/p/6250782.html 。
最后此篇关于Python解析命令行读取参数--argparse模块使用方法的文章就讲到这里了,如果你想了解更多关于Python解析命令行读取参数--argparse模块使用方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我最近在我的机器上安装了 cx_Oracle 模块,以便连接到远程 Oracle 数据库服务器。 (我身边没有 Oracle 客户端)。 Python:版本 2.7 x86 Oracle:版本 11.
我想从 python timeit 模块检查打印以下内容需要多少时间,如何打印, import timeit x = [x for x in range(10000)] timeit.timeit("
我盯着 vs 代码编辑器上的 java 脚本编码,当我尝试将外部模块包含到我的项目中时,代码编辑器提出了这样的建议 -->(文件是 CommonJS 模块;它可能会转换为 ES6 模块。 )..有什么
我有一个 Node 应用程序,我想在标准 ES6 模块格式中使用(即 "type": "module" in the package.json ,并始终使用 import 和 export)而不转译为
我正在学习将 BlueprintJS 合并到我的 React 网络应用程序中,并且在加载某些 CSS 模块时遇到了很多麻烦。 我已经安装了 npm install @blueprintjs/core和
我需要重构一堆具有这样的调用的文件 define(['module1','module2','module3' etc...], function(a, b, c etc...) { //bun
我是 Angular 的新手,正在学习各种教程(Codecademy、thinkster.io 等),并且已经看到了声明应用程序容器的两种方法。首先: var app = angular.module
我正在尝试将 OUnit 与 OCaml 一起使用。 单元代码源码(unit.ml)如下: open OUnit let empty_list = [] let list_a = [1;2;3] le
我在 Angular 1.x 应用程序中使用 webpack 和 ES6 模块。在我设置的 webpack.config 中: resolve: { alias: { 'angular':
internal/modules/cjs/loader.js:750 return process.dlopen(module, path.toNamespacedPath(filename));
在本教程中,您将借助示例了解 JavaScript 中的模块。 随着我们的程序变得越来越大,它可能包含许多行代码。您可以使用模块根据功能将代码分隔在单独的文件中,而不是将所有内容都放在一个文件
我想知道是否可以将此代码更改为仅调用 MyModule.RED 而不是 MyModule.COLORS.RED。我尝试将 mod 设置为变量来存储颜色,但似乎不起作用。难道是我方法不对? (funct
我有以下代码。它是一个 JavaScript 模块。 (function() { // Object var Cahootsy; Cahootsy = { hello:
关闭。这个问题是 opinion-based 。它目前不接受答案。 想要改进这个问题?更新问题,以便 editing this post 可以用事实和引文来回答它。 关闭 2 年前。 Improve
从用户的角度来看,一个模块能够通过 require 加载并返回一个 table,模块导出的接口都被定义在此 table 中(此 table 被作为一个 namespace)。所有的标准库都是模块。标
Ruby的模块非常类似类,除了: 模块不可以有实体 模块不可以有子类 模块由module...end定义. 实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看
我有一个脚本,它从 CLI 获取 3 个输入变量并将其分别插入到 3 个变量: GetOptions("old_path=s" => \$old_path, "var=s" =
我有一个简单的 python 包,其目录结构如下: wibble | |-----foo | |----ping.py | |-----bar | |----pong.py 简单的
这种语法会非常有用——这不起作用有什么原因吗?谢谢! module Foo = { let bar: string = "bar" }; let bar = Foo.bar; /* works *
我想运行一个命令: - name: install pip shell: "python {"changed": true, "cmd": "python <(curl https://boot
我是一名优秀的程序员,十分优秀!