通配符 * 未被 python argparse 解释

Wildcard * not interreted by python argparse

我正在尝试编写一个可以获取目录中所有文件并允许用户使用 * 引用多个文件的脚本。

这是我设置解析器以接收输入文件的行:

parser.add_argument('-f', '--files', help='The files to compare.', required=True, nargs='+')

这是错误行

Invalid argument: '.\rmsd\*.xyz'

这是我运行执行脚本的代码

python .\rsmd.py -r .\rmsd.xyz -f .\rmsd\*.xyz

我的目的是让用户使用Windows和Linux中的脚本。

在 Windows 上,python 仅接收 .\rmsd\*.xyz 作为字符串,它不会评估哪些文件与模式匹配。你可以使用例如glob 模块来解析它。

import glob
my_txt_files = glob.glob("*.txt")  # returns list of filenames in current directory matching the pattern
# e.g.:
matched_files = glob.glob(arguments.files)

针对平台编辑:

您可以检查是否匹配了多个文件以使其更多platform-independent

import argparse
import glob

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--files', nargs='+')
arguments = parser.parse_args()
matched_files = []
for file in arguments.files:
    if glob.escape(file) != file:
        # -> There are glob pattern chars in the string
        matched_files.extend(glob.glob(file))
    else:
        matched_files.append(file)

如果你不想在程序中处理它,你可以像这样在Powershell上使用预先扩展启动程序

python rsmd.py -f (get-childitem *.txt)