Python argparse 在 Windows 中无法正确处理路径

问题描述 投票:0回答:1

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 有什么问题吗?

我什至不知道如何搜索这个问题...

python powershell argparse
1个回答
3
投票

你看到什么是Windows PowerShell中的bug,此后已在PowerShell(核心)7+更正:

  • 对于PowerShell来说,根据它自己的string literals的语法,字符串

    ".\test test\"
    的逐字值是
    .\test test\

  • 但是,基于在Windows上最广泛使用的解析process命令行的约定,在调用

    外部程序时,该字符串必须作为
    ".\test test\\"放在构建behind the scenes的进程命令行上,因为预计进程将
    \"
    解析为 escaped
    "
    char.

    • 虽然 PowerShell (Core) 7+ 现在 does 在幕后执行此操作,Windows PowerShell not,导致 Python 将结尾的
      \"
      解释为 verbatim
      "
      (而 not 抱怨 unescaped
      "
      - 即具有 syntactic 功能的 - 是 missing).

Windows PowerShell 的解决方法手动

\
字符加倍。收盘前
"
:

# Windows PowerShell only: double the \ before the closing "
python sample.py -w ".\test test\\"

顺便说一句:虽然 PowerShell (Core) 7+ 已经修复了这个特殊问题,但仍然存在一个长期存在的问题,即故意在传递给外部程序的参数中嵌入

"
字符 - 请参阅这个答案.

© www.soinside.com 2019 - 2024. All rights reserved.