python 中的
argparse
库不适用于路径,包含空格,末尾有'\'(反斜杠)。
argparse 中的解析器将路径末尾的反斜杠解析为 "(双引号)。
下面的代码是有同样问题的示例。
import argparse
if __name__=="__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-w', '--weight', type=str)
args = parser.parse_args()
print(args.weight_path)
例如在PowerShell中,
PS > python sample.py -w ".\test test\"
.\test test"
它确实适用于不包含空格的路径。
PS > python sample.py -w ".\testtest\"
.\test test\
PS > python sample.py -w "testtest\"
test test\
PS > python sample.py -w "testtest"
test test
在 PowerShell 中使用 argparse 有什么问题吗?
我什至不知道如何搜索这个问题...
你看到什么是Windows PowerShell中的bug,此后已在PowerShell(核心)7+中更正:
对于PowerShell来说,根据它自己的string literals的语法,字符串
".\test test\"
的逐字值是.\test test\
但是,基于在Windows上最广泛使用的解析process命令行的约定,在调用
外部程序时,该字符串必须作为
".\test test\\"
放在构建behind the scenes的进程命令行上,因为预计进程将 \"
解析为 escaped "
char.
\"
解释为 verbatim "
(而 not 抱怨 unescaped "
- 即具有 syntactic 功能的 - 是 missing).Windows PowerShell 的解决方法是手动将
\
字符加倍。收盘前"
:
# Windows PowerShell only: double the \ before the closing "
python sample.py -w ".\test test\\"
顺便说一句:虽然 PowerShell (Core) 7+ 已经修复了这个特殊问题,但仍然存在一个长期存在的问题,即故意在传递给外部程序的参数中嵌入
"
字符 - 请参阅这个答案.