使用sys.argv的Python命令行参数

时间:2015-04-07 23:31:34

标签: python

在下面的回复之后,我理解了

之间的区别

dir_path = sys.argv[1]和dir_path = sys.argv[1:]

我试图理解代码失败的原因。我想要做的是:

  • 从命令行
  • 读取目标目录
  • 遍历目标目录中的所有子目录,并对子目录中的所有文件执行untar操作(不是由我编写)
  • 对解压缩的文件进行一些后期处理

以下是代码段。它到达for循环时抛出错误

if __name__ == '__main__':

dir_path = sys.argv[1:]

total = untar(sys.argv[1:])
print total

for radar_list in os.listdir(dir_path):
     #do some post-processing

def untar(paths):
    total = 0
    for path in paths:
        if os.path.isdir(path):
            try:
                dir_list = os.listdir(path)
            except:
                pass
            else:
                total += untar(os.path.join(path, new) for new in dir_list)
        elif os.path.isfile(path):
            try:
                tarfile.open(path).extractall(os.path.dirname(path))
            except:
                pass
            else:
                total += 1
    return total

错误是:

Traceback (most recent call last):
  File "post_p.py", line 304, in <module>
    for issue_list in os.listdir(dir_path):
TypeError: coercing to Unicode: need string or buffer, list found

4 个答案:

答案 0 :(得分:1)

当你通过python myprog.py arg1 arg2 arg3时。它以列表形式传递。

其中:

[0] --> path/to/your/program.py
[1] --> arg1
[2] --> arg2
[3] --> arg3

sys.argv[1]会给你arg1

sys.argv[1:]会给你[arg1, arg2, arg3]

答案 1 :(得分:0)

第一个是字符串,第二个是包含除第一个之外的所有参数的列表。

答案 2 :(得分:0)

如果只有一个参数没有区别,通常[1:]会选择数组中除第一个之外的所有元素:

A = [0, 1, 2]  
print A[1]  
>>>  1  
print A[1:]  
>>>> [1, 2]

答案 3 :(得分:0)

以这种方式看待它。使用sys.argv传递参数时,请以列表形式传递参数。所以你要做的就是访问列表元素或切片列表。

一个简单的例子是:

>>> l = [1,2,3,4,5]
>>> l[1]
2
>>> l[1:]
[2, 3, 4, 5]

因此,当您运行程序时,我假设您正在执行

python program.py "c\path\2somewhere",   1,        2  
#This  argv[0]       argv[1]           argv[2]   argv[3]

如果你看一下如何在考虑示例背景的情况下运行程序,我认为你可以看到差异:使

相关问题