小编典典

在UNIX环境中运行时,防止在未加引号的python脚本参数中扩展通配符

python

我有一个python脚本,我想提供一个包含通配符的参数(通常),指的是我想做的一系列文件。这里的例子:

#!/usr/bin/env python

import argparse
import glob

parser = argparse.ArgumentParser()
parser.add_argument('-i', action="store", dest="i")
results = parser.parse_args()
print 'argument i is: ', results.i
list_of_matched_files = glob.glob(results.i)

在这种情况下,如果用户将引号添加到传递的参数中,则一切工作都很好,例如:

./test_script.py -i "foo*.txt"

…但是通常情况下,用户忘了在引号上添加引号,并且当列表仅包含第一个匹配项时,用户会感到困惑,因为UNIX已经扩展了列表,而argparse仅获得了第一个列表元素。

有没有办法(在脚本内)阻止UNIX在将列表传递给python之前对其进行扩展?或者甚至只是为了测试参数是否不包含引号,然后警告用户?


阅读 215

收藏
2021-01-20

共1个答案

小编典典

进行扩展的不是UNIX,而是shell。

Bash有一个选项set -o noglob(或-f)可以关闭全局性(文件名扩展),但这是非标准的。

如果您授予最终用户对命令行的访问权限,那么他们真的应该了解引用。例如,常用find命令具有-name可以采用glob构造的参数,但必须以类似的方式将其引号。您的程序与其他程序没有什么不同。

如果用户无法处理该问题,那么也许您应该给他们一个不同的界面。您可能会写一个GUI或Web / HTML前端,但是这可能是最重要的。

还是为什么不提示输入文件名模式?例如,您可以使用-p选项来指示提示,例如:

import argparse
import glob

parser = argparse.ArgumentParser()
parser.add_argument('-i', action="store", dest="i")
parser.add_argument('-p', action="store_true", default=False)

results = parser.parse_args()

if results.p:
    pattern = raw_input("Enter filename pattern: ")
else:
    pattern = results.i

list_of_matched_files = glob.glob(pattern)
print list_of_matched_files

(由于您的print陈述,我假设使用Python 2 )

在这里,输入不是由外壳读取,而是由python读取,除非您要求,否则它将不会扩展glob构造。

2021-01-20