glob.glob 的意外输出
Unexpected output with glob.glob
我正在尝试为 CLI
脚本之一提供通配符支持,我正在为其使用 pythons glob
模块。为了进行测试,我尝试了这个:
>>> import glob
>>> for f in glob.glob('/Users/odin/Desktop/test_folder/*.log'):
... print f
...
/Users/odin/Desktop/test_folder/test1.log
/Users/odin/Desktop/test_folder/test2.log
/Users/odin/Desktop/test_folder/test3.log
这完美地工作并提供正确的输出,因为我有上面给出的 3 个文件。
但是,当我在 CLI
中的参数下使用相同的代码时,它会失败。我这样做
#code...
parser.add_argument( "-f", "--file", type=str, help="Full path to the file to upload." )
#code...
if args.file:
for f in glob.glob(args.file):
_upload_part(f)
我运行这是
python cli.py -f /Users/odin/Desktop/test_folder/*.log
这给了我错误:
cli.py: error: unrecognized arguments: /Users/odin/Desktop/test_folder/test2.log /Users/odin/Desktop/test_folder/test3.log
我不明白为什么当我一个一个地浏览列表时,所有文件都一次添加到参数中。
编辑-
nargs
是朝着正确方向迈出的一步,但现在出现此错误:
`Traceback (most recent call last):
File "cli.py", line 492, in <module>
for f in glob.glob(args.file):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/glob.py", line 27, in glob
return list(iglob(pathname))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/glob.py", line 38, in iglob
dirname, basename = os.path.split(pathname)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", line 92, in split
i = p.rfind('/') + 1
AttributeError: 'list' object has no attribute 'rfind'`
这是您的脚本收到的内容:
python cli.py -f file1 file2 file3 fileN
其中 N 是与该模式匹配的文件总数(Shell 自动扩展通配符)。另一方面,您的 file 参数配置为仅接收一个 file/pattern,因此最简单(也是我认为最好的)解决方案是添加 nargs='+'
argument:
parser.add_argument('-f', '--file', type=str, help='...', nargs='+')
# code
for f in args.file:
print(f)
这将允许您删除所有 glob
调用和 if args.file
检查。
另一种选择是引用您的命令行参数:
python cli.py -f '/Users/odin/Desktop/test_folder/*.log'
我正在尝试为 CLI
脚本之一提供通配符支持,我正在为其使用 pythons glob
模块。为了进行测试,我尝试了这个:
>>> import glob
>>> for f in glob.glob('/Users/odin/Desktop/test_folder/*.log'):
... print f
...
/Users/odin/Desktop/test_folder/test1.log
/Users/odin/Desktop/test_folder/test2.log
/Users/odin/Desktop/test_folder/test3.log
这完美地工作并提供正确的输出,因为我有上面给出的 3 个文件。
但是,当我在 CLI
中的参数下使用相同的代码时,它会失败。我这样做
#code...
parser.add_argument( "-f", "--file", type=str, help="Full path to the file to upload." )
#code...
if args.file:
for f in glob.glob(args.file):
_upload_part(f)
我运行这是
python cli.py -f /Users/odin/Desktop/test_folder/*.log
这给了我错误:
cli.py: error: unrecognized arguments: /Users/odin/Desktop/test_folder/test2.log /Users/odin/Desktop/test_folder/test3.log
我不明白为什么当我一个一个地浏览列表时,所有文件都一次添加到参数中。
编辑-
nargs
是朝着正确方向迈出的一步,但现在出现此错误:
`Traceback (most recent call last):
File "cli.py", line 492, in <module>
for f in glob.glob(args.file):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/glob.py", line 27, in glob
return list(iglob(pathname))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/glob.py", line 38, in iglob
dirname, basename = os.path.split(pathname)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", line 92, in split
i = p.rfind('/') + 1
AttributeError: 'list' object has no attribute 'rfind'`
这是您的脚本收到的内容:
python cli.py -f file1 file2 file3 fileN
其中 N 是与该模式匹配的文件总数(Shell 自动扩展通配符)。另一方面,您的 file 参数配置为仅接收一个 file/pattern,因此最简单(也是我认为最好的)解决方案是添加 nargs='+'
argument:
parser.add_argument('-f', '--file', type=str, help='...', nargs='+')
# code
for f in args.file:
print(f)
这将允许您删除所有 glob
调用和 if args.file
检查。
另一种选择是引用您的命令行参数:
python cli.py -f '/Users/odin/Desktop/test_folder/*.log'