在下面的回复之后,我理解了
之间的区别 dir_path = sys.argv[1
]和dir_path = sys.argv[1:]
我试图理解代码失败的原因。我想要做的是:
以下是代码段。它到达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
答案 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]
如果你看一下如何在考虑示例背景的情况下运行程序,我认为你可以看到差异:
使