如何在Python中传递任意参数

在我必须做的任务中,我想创建一个替代'rm'命令的方法。我必须传递可变数量的参数,如

$ rm.py /path/to/some/file ./somefile someotherfile
$ rm.py /path/to/some/file ./somefile someotherfile -r
$ rm.py -r /path/to/some/file ./somefile someotherfile
$ rm.py *.java

-r参数可以在任何位置作为任何参数传递。 -r的含义与使用常规“ rm”命令时的含义相同。 它以递归方式删除目录及其中的内容。

它运行脚本,并且给出的路径都一样

rm.py /path/to/some/file

然后将其移至输出目录“〜/ rm_trash” 如果有重复,我也担心。

但是,开始时,我在理解如何处理它时遇到了一些麻烦。 我是否应该在for循环中进行处理,并且其中一个参数等于“ -r”,然后从那里进行处理?

我应该导入并使用argparse吗?

我还有其他问题,但是我想先解决上面我要问的问题。

必须重新发布,但仍然不明白如何获取除“ r”以外的任意数量参数的特定参数。

xhy_will 回答:如何在Python中传递任意参数

我将使用argparse,因为您可以指定乱序操作:

https://docs.python.org/3/library/argparse.html

,

如果您不想使用argparse,或者不能出于分配目的,则可以查看sys.argv内:

is_recursive = any(arg == '-r' for arg in sys.argv)  

# `paths` will be a list of all other arguments
paths = [arg for arg in sys.argv if arg != '-r']   
,

定义一个解析函数,该函数查找'-r'字符串:

def parse(alist,astr='-r'):
    try:
        idx = alist.index(astr)
        r = alist.pop(idx)
        return True,alist
    except ValueError:
        return False,alist

如果这样做

import sys
r,rest = parse(sys.argv[1:])

应为r给出True / False值,并提供文件名列表。使用其余代码。

测试:

In [326]: list1 = 'rm.py /path/to/some/file ./somefile someotherfile'.split()   
In [329]: r,rest = parse(list1[1:])                                            
In [330]: r,rest                                                               
Out[330]: (False,['/path/to/some/file','./somefile','someotherfile'])

In [331]: list2 = 'rm.py /path/to/some/file ./somefile someotherfile -r'.split()                                                                     
In [332]: r,rest = parse(list2[1:])                                            
In [333]: r,rest                                                               
Out[333]: (True,'someotherfile'])

为了说明当出现“ -r”时会发生什么:

In [335]: list2.index('-r')                                                     
Out[335]: 4
In [336]: list2.pop(4)                                                          
Out[336]: '-r'
In [337]: list2                                                                 
Out[337]: ['rm.py','/path/to/some/file','someotherfile']

如果不存在,我们会得到一个ValueError

In [338]: list1.index('-r')                                                     
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-338-807fbe60be44> in <module>
----> 1 list1.index('-r')

ValueError: '-r' is not in list

======

使用argparse的等效功能:

In [339]: import argparse                                                       
In [340]: parser = argparse.ArgumentParser()                                    
In [341]: parser.add_argument('-r',action='store_true',help='recursive flag');                                                                       
In [342]: parser.add_argument('rest',nargs='*',help='file names');            
In [343]: args = parser.parse_args(list1[1:])                                   

使用args = parser.parse_args()来读取sys.argv

结果是一个namespace对象,该对象具有所需的属性:

In [344]: args                                                                  
Out[344]: Namespace(r=False,rest=['/path/to/some/file','someotherfile'])
In [345]: args.r                                                                
Out[345]: False
In [346]: args.rest                                                             
Out[346]: ['/path/to/some/file','someotherfile']

以与上述args.rargs.rest相同的方式使用rrest

'-r'可以在文件名列表之前或之后。当您想定义更多选项(例如,-r)时,argparse变得更加有用。它还负责显示帮助消息和有意义的错误。

In [347]: parser.parse_args(['--help'])                                         
usage: ipython3 [-h] [-r] [rest [rest ...]]

positional arguments:
  rest        file names

optional arguments:
  -h,--help  show this help message and exit
  -r          recursive flag
,

为什么不使用:

os.system( 'rm ' + ' '.join( sys.argv[1:] )

并完成它。

本文链接:https://www.f2er.com/3147054.html

大家都在问