jjzjj

python argh/argparse : How can I pass a list as a command-line argument?

coder 2023-05-20 原文

我正在尝试使用 argh 库将参数列表传递给 python 脚本。可以接受如下输入的东西:

./my_script.py my-func --argA blah --argB 1 2 3 4
./my_script.py my-func --argA blah --argB 1
./my_script.py my-func --argA blah --argB 

我的内部代码如下所示:

import argh

@argh.arg('--argA', default="bleh", help='My first arg')
@argh.arg('--argB', default=[], help='A list-type arg--except it\'s not!')
def my_func(args):
    "A function that does something"

    print args.argA
    print args.argB

    for b in args.argB:
        print int(b)*int(b)  #Print the square of each number in the list
    print sum([int(b) for b in args.argB])  #Print the sum of the list

p = argh.ArghParser()
p.add_commands([my_func])
p.dispatch()

这是它的行为方式:

$ python temp.py my-func --argA blooh --argB 1
blooh
['1']
1
1

$ python temp.py my-func --argA blooh --argB 10
blooh
['1', '0']
1
0
1

$ python temp.py my-func --argA blooh --argB 1 2 3
usage: temp.py [-h] {my-func} ...
temp.py: error: unrecognized arguments: 2 3

问题似乎很简单:argh 只接受第一个参数,并将其视为字符串。如何让它“期望”一个整数列表?

我看到 how this is done in optparse ,但是(未弃用的)argparse 呢?或者使用 argh 更好的修饰语法?这些看起来更像 python 。

最佳答案

使用 argparse,您只需使用 type=int

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-a', '--arg', nargs='+', type=int)
print parser.parse_args()

示例输出:

$ python test.py -a 1 2 3
Namespace(arg=[1, 2, 3])

编辑:我不熟悉 argh,但它似乎只是 argparse 的包装,这对我有用:

import argh

@argh.arg('-a', '--arg', nargs='+', type=int)
def main(args):
    print args

parser = argh.ArghParser()
parser.add_commands([main])
parser.dispatch()

示例输出:

$ python test.py main -a 1 2 3
Namespace(arg=[1, 2, 3], function=<function main at 0x.......>)

关于python argh/argparse : How can I pass a list as a command-line argument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9398065/

有关python argh/argparse : How can I pass a list as a command-line argument?的更多相关文章

  1. javascript - d3.js : non linear graph axis - 2

    我正在尝试在轴上添加自定义刻度,如下所示想法是一个刻度总是比前一个刻度大2倍。我的理解是这是自定义比例。我做了一些研究,但找不到类似的东西。所以我想我的问题实际上是两个问题:这个尺度是数学世界的“标准”吗?是否可以使用d3.js来实现?也欢迎任何指向相关教程或现场示例(即jsFiddle)的链接。编辑:我现在问了arelatedquestiononmathematica.stackexchange.comtohelpmefindthesolutiontothisproblem&将在我尝试一些操作后更新这篇文章。 最佳答案 在这种情况

  2. javascript - 动态规划 : Code Wars: twice linear: algorithm times out - 2

    我在CodeWars中遇到了卡塔:https://www.codewars.com/kata/5672682212c8ecf83e000050/train/javascript这个想法是创建一个数字序列,其中每个数字都是按照以下两个公式隐式创建的:y=2x+1z=3x+1x是序列中的当前数字。从1开始,序列会像这样增长:sequence=[1]x=1y=2*1+1=3z=3*1+1=4leadingtosequence=[1,3,4]将它应用到下一个数字会导致:x=3y=2*3+1=7z=3*3+1=10leadingtosequence=[1,3,4,7,10]x=4y=2*4+1=

  3. android - xmlns :android ="http://schemas.android.com/apk/res/android" this line is marked as error in Linear Layout - 2

    在我的XML文件中,我制作了一些LinearLayout,但出于某种原因,我在线上遇到错误:xmlns:android="http://schemas.android.com/apk/res/android"。它标有红色(错误)并且错误日志显示:“Unexpectednamespaceprefix"xmlns"foundfortagLinearLayout"有人知道这是什么意思吗? 最佳答案 1)仅在您拥有的最外层布局中使用它。指定一次就足够了。删除它的所有其他实例。参见Unexpectednamespaceprefix"xmlns

  4. C#/XSLT : Linearizing XML partially working code - 2

    输入XML:ReportedBy:L&AQTESTING,TESTEDDateofTESTING:AvailableTESTINGunavailabletoresolveTestissue.AdditionalComments:CommentsHadtogointoTestingSystemandchangetothecorrectnotificationgroup.Persup.XSLT代码:预期输出:ReportedBy:L&AQTESTING,TESTEDDateofTESTING:AvailableTESTINGunavailabletoresolveTesti

  5. python - 是否可以在没有任何标志的情况下使用 argparse? - 2

    是否可以在没有任何标志的情况下使用argparse?例如,只要没有提供标志(在本例中为-u或-i),我希望脚本处理第一个参数sys.argv[1]作为IP地址。代码importargparse,sysparser=argparse.ArgumentParser()parser.add_argument('-u')parser.add_argument('-i')args=parser.parse_args()ifargs.i:print("IPAddressis"+args.i)elifargs.u:print("URLis"+args.u)eliflen(sys.argv)>1:pr

  6. python - 在 Python 中使用 argparse - 和默认文件关联 - 2

    我有一个名为“test.py”的文件,它使用简单的代码导入argparse:importargparseparser=argparse.ArgumentParser(description='Description')parser.add_argument('-e','--event',help='event',required=True)args=vars(parser.parse_args())myArgument=args['event']如果我用从Windows调用它python"test.py"-ehello它工作正常,但如果我尝试直接调用它test.py-ehello它正在

  7. c++ - 为什么 linear_congruential_engine::seed(Sseq) 会丢弃种子序列生成的三个数字? - 2

    C++标准(从C++11一直到当前的C++17草案)在[rand.eng.lcong]中说明如下:templateexplicitlinear_congruential_engine(Sseq&q);Effects:Constructsalinear_congruential_engineobject.Withk=⌈log2(m)÷32⌉andaanarray32(orequivalent)oflengthk+3,invokesq.generate(a+0,a+k+3)andthencomputesS=(∑j=0k−1aj+3·232​j)modm.Ifcmodmis0andSis0,

  8. c++ - 如何正确链接 boost::mpl::inherit_linearly 和 boost::mpl::inherit 以便解析占位符? - 2

    假设我有这些类型:templateclassStorage>structAbstractFactoryUnit{virtual~AbstractFactoryUnit(){}virtualtypenameStorage::StoredTypedoCreate(Storage)=0;};和templateclassProductStorage,templateclass>classUnit=AbstractFactoryUnit>structAbstractFactory:boost::mpl::inherit_linearly>>::type{typedefTypeSequencePr

  9. 线性电机(linear motor) - 2

    线性马达一般指线性电机线性马达是一种将电能直接转换成直线运动机械能,而不需要任何中间转换机构的传动装置。它可以看成是一台旋转电机按径向剖开,并展成平面而成。直线电机也称线性电机,线性马达,直线马达,推杆马达。最常用的直线电机类型是平板式和U型槽式,和管式。线圈的典型组成是三相,由霍尔元件实现无刷换相。线性马达的工作原理类似于打桩机,实际上是一个依靠线性形式运动的弹簧质量块,将电能直接转换为直线运动机械能的发动模块。线性马达依靠交流电压驱动压靠与弹簧连接的移动质量块的音圈,音圈在弹簧的共振频率下被驱动时,使整个传动器振动。由于直接驱动质量块做线性运动,所以响应速度非常快,振感也非常的强。 马达是

  10. argparse简介 - 2

    一、argparse简介argparse模块是Python内置的用于命令项选项与参数解析的模块,argparse模块可以让人轻松编写用户友好的命令行接口,能够帮助程序员为模型定义参数。argparse定义四个步骤导入argparse包——importargparse创建一个命令行解析器对象——创建ArgumentParser()对象给解析器添加命令行参数——调用add_argument()方法添加参数解析命令行的参数——使用parse_args()解析添加的参数2.举个栗子#导入库importargparse#1.定义命令行解析器对象parser=argparse.ArgumentParser

随机推荐