最近在脚本中需要用的命令行参数的解析,所以就学了一下。
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="CLI args collection test...")
parser.add_argument('-t', '--time', metavar="define timestamp", nargs=2)
args = parser.parse_args()
print(args.time)
测试:
Administrator@Eclipse MINGW64 ~/Desktop/cookbook
$ py -3 argparse_test.py -t 2019 2020
['2019', '2020']
Administrator@Eclipse MINGW64 ~/Desktop/cookbook
$ py -3 argparse_test.py -t 2019 2020 2021
usage: argparse_test.py [-h] [-t define timestamp define timestamp]
argparse_test.py: error: unrecognized arguments: 2021
这里指定了一个参数的两个形式,长参数--time,短参数-t,这里的
metavar 用来生成帮助信息
nargs 定义参数的个数,这里是2个,给一个或者超过2个都会报错,输出的参数集是列表的形式
add_argument的参数有以下:
nargs: 指这个参数后接几个参数,如上例子
default: 参数的默认值
将上述代码的time参数修改如下:
parser.add_argument('-t', dest='time', default='2019-11-30')
输出:
$ py -3 argparse_test.py
2019-11-30
---
$ py -3 argparse_test.py -t '2019-12-01'
2019-12-01
help: 设置帮助信息,这个没什么好说的,在
-h下输出帮助信息
dest: 这个是参数变量对应的名字,如上
-t 2019-12-01,time的值就是-t后的值。如上的args.time
required: 字面意思都知道,是否是必须的。对应布尔值
TrueorFalse。默认是False,可以不给。
代码修改如下,
parser.add_argument('-t', dest='time', required=False)
调试:
$ py -3 argparse_test.py
None
修改为True
parser.add_argument('-t', dest='time', required=True)
$ py -3 argparse_test.py
usage: argparse_test.py [-h] -t TIME
argparse_test.py: error: the following arguments are required: -t
choices: 设置默认的参数值范围
在上述代码中加入:
parser.add_argument('-e', dest='env', choices=['production', 'stage', 'pre-release'], required=True)
测试:
$ py -3 argparse_test.py -e test
usage: argparse_test.py [-h] -e {production,stage,pre-release}
argparse_test.py: error: argument -e: invalid choice: 'test' (choose from 'production', 'stage', 'pre-release')
---
$ py -3 argparse_test.py -e stage
stage
type: 定义参数的类型,
int,str,float等常用数据类型
$ py -3 argparse_test.py -a eclipse
usage: argparse_test.py [-h] [-a AGE]
argparse_test.py: error: argument -a/--age: invalid int value: 'eclipse'
---
$ py -3 argparse_test.py --age=23
23
action: 对应的值较多,常用的是
store,这个也是默认的,保存该参数值。
action="append":指当同一参数有多个值时,将其保存到一个列表中
如上例子,-a 23 --age=32那么age的输出是列表:
parser.add_argument('-a', '--age', dest='age', action='append', type=int)
args = parser.parse_args()
print(args.age)
$ py -3 argparse_test.py -a 23 --age=32
[23, 32]
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option