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

ws51t4hk  于 2023-03-12  发布在  Shell
关注(0)|答案(1)|浏览(240)

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有什么问题吗?
我甚至不知道如何搜索这个问题...

pkwftd7m

pkwftd7m1#

您现在看到的是 Windows PowerShell中的*错误 *,该错误已在PowerShell (Core) 7+得到纠正:

  • 对于PowerShell来说,基于它自己的string literals的语法,字符串".\test test\"的逐字值是.\test test\,因为\在PowerShell中 * 没有 * 特殊含义(PowerShell的转义符是```,即所谓的 * 反勾号 *)。
  • 但是,根据Windows上最广泛使用的解析 process 命令行的约定,在调用 * 外部程序 * 时,必须将此字符串作为".\test test\\"放置在 * 后台 * 构造的进程命令行上,因为进程预期将\"解析为 escaped"字符。
  • 虽然 PowerShell(酷睿)7+ 现在 * 可以 * 在后台执行此操作,但 *Windows PowerShell**不能 *:它放置了".\test test\",这使得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+ 已修复 * 此特定问题 *,但在传递给外部程序的参数中 * 故意 * 嵌入"字符方面仍存在一个长期存在的问题-请参见this answer

相关问题