Python argparse带引号的参数

13

有没有办法告诉argparse不要吞噬引号?

例如,当我给出带引号的参数时,argparse只将引号内部的内容作为参数。 我想要捕获引号本身(而无需在命令行上转义它们)。

pbsnodes -x | xmlparse -t "interactive-00"

生成

interactive-00

I want

"interactive-00"
3个回答

16

我认为是shell吃掉了它们,因此Python实际上永远看不到它们。在命令行中转义它们可能是您唯一的选择。

如果您不喜欢“反斜杠”样式的转义,那么可以使用以下方法代替:

pbsnodes -x | xmlparse -t '"interactive-00"'

2
这正是情况所在。Shell将引号视为“获取其中的任何内容,即使它包含空格。” 它确实如此。这就是在Shell中使用引号的目的。 - kindall
感谢您提供的好解决方案。 - Abhay Dwivedi
是 shell 还是 C 运行时库的问题?Shell 将命令原封不动地传递给进程,解析参数由 RTL 完成。我认为是 Perl 的 RTL 吃掉了引号,或者是后面的其他东西。 - il--ya
@JosVerlinde 您的评论似乎不正确。Argparse 不会去除引号:在线尝试! - wim
@wim - 我改口了 - arparse是无辜的 - 我错误地假设在使用Jupyter时不涉及shell - Jos Verlinde
显示剩余2条评论

1

Python进程本身将命令行解析为参数向量。根据Python的构建方式,这将由某种运行时库完成。对于Windows版本,最可能使用的是MS Visual C++运行时库。有关它如何解析命令行的更多详细信息可以在Visual C++文档中找到:解析C++命令行参数

特别地:

  • 用双引号("string")括起来的字符串将被解释为单个参数,无论其中包含的空格如何。一个带引号的字符串可以嵌入到一个参数中。

  • 由反斜杠(\)前缀的双引号(\")将被解释为字面上的双引号字符(")。

如果您想查看未处理的命令行,在Windows上可以这样做:

import win32api
print(win32api.GetCommandLine())

0
对我来说
'"TEXT"'

没用PowerShell,但是用cmd可以。

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接