【问题标题】:arguments parsed differently in pycharm and console在 pycharm 和控制台中解析不同的参数
【发布时间】:2018-10-29 15:25:42
【问题描述】:

当我注意到 PyCharm 的行为与我的控制台不同时,我试图通过 PyCharm 传递一些参数。当我在所有参数之间传递没有空格的参数时都可以正常工作,但是当我的参数中包含空格时,行为就会不同。

def main():
    """
    Main function
    """
    for i, arg in enumerate(sys.argv):
        print('Arg#{}: {}'.format(i, arg))

如果我运行相同的功能:

python3 argumnents_tester.py 'argument 1' argument2

PyCharm 中运行:

Arg#0:/home/gorfanidis/PycharmProjects/test1/argparse_test.py
Arg#1: '参数
Arg#2:1'
参数#3:参数2

控制台中运行:

Arg#0:argparse_test.py
Arg#1:参数 1
参数#2:参数2

因此,PyCharm 倾向于完全忽略引号,并使用空格分割参数,而不考虑任何引号。此外,带引号的参数与不带引号的相同参数的处理方式不同。

问题是为什么会发生这种情况,在实际层面上,我应该如何使用 PyCharm 传递包含空格的参数?

顺便说一下,我使用的是 Ubuntu 16.04。

【问题讨论】:

  • 您尝试过使用不同类型的报价吗? str.format()print() 中的双引号和在pycharm 中的命令参数引用的单引号?
  • @cryptonome 你是对的,它似乎可以使用双引号。如果您愿意提供它作为答案,我会接受。
  • 事情是我认为@guidot 也是正确的,除非这严格不会部署在其他任何地方,您应该考虑该标准如何在野外的各种命令行中工作,即 sh,重击,zsh
  • 问题是我希望 PyCharm 和控制台具有相同的功能,所有其他都是关于代码潜在用途的假设。
  • 好吧,我会用后记来写一个答案,列出对 shell 与 pycharm 的关注。

标签: python shell pycharm


【解决方案1】:

您抱怨的是外壳问题。 shell 应用其单引号约定来解析参数。实际上,我发现 PyCharm 的行为是可以理解和一致的;如果不涉及 shell,则没有人能完成您期望的工作。

如果您坚持从 pycharm 运行它,我会建议另一种传递方法(例如通过文件)或应用一些取消引用机制作为 urllib.parse.unquote

另请参阅here,了解对命令行参数的一般说明,但仍然正确,具体来说:

ANSI C 标准没有指定命令行参数的构成,因为操作系统在这一点上有很大的不同。但是,最常见的约定如下:

每个命令行参数必须用空格或制表符分隔。逗号、分号等不被视为分隔符。

【讨论】:

  • ANSI C 标准的定义不一定正确。无论如何,这并不能解决如何解析包含空格的参数的问题。
【解决方案2】:

免责声明:事实证明,@Eypros 问题的正确解决方案是一个短暂的怀疑,即 PyCharm 如何在其命令行运行中实现其参数解析与实际系统控制台/ shell 的行为,@guidot 在他的回答中也指出了这一点。我在下面的 Postscript 中提供了更多想法

要规避 PyCharm 在解释 python3 argumnents_tester.py 'argument 1' argument2 中的 argument 1 部分(作为 2 个参数)时表现出的行为,请在代码中使用不同类型的引号,即双引号 @ 987654323@ 表示str.format(),单引号' 表示运行命令中的参数。

PS:
虽然这似乎是一种简单的解决方法,但我确实认为,如果代码有可能在任何其他系统中执行,应该选择遵守最常见/广泛接受的系统 shell 标准行为(bash、zsh、 sh,任何 *nix 风格)在解释参数传递而不是 PyCharm 的实现。这样,代码将更加可移植,用户不必想出不同的方式来传递/提供参数。
因此,我不保证除了代码制定和配置类似于@Eypros 系统的这种特定方式之外,这将起作用。

【讨论】:

  • 我只是说双引号作为参数提供时按预期工作。 PyCharm 处理单引号和双引号的方式不同。就这样。代码和参数中没有不同的代码。
  • 也许我不清楚,这种解决方法有效是因为 PyCharm 和 shell 的不同,而不是你的代码本身。所以我为遇到同样问题的其他 PyCharm 用户提供免责声明和附言,这不是针对你的。
  • 我特别谈到了您回复的主要部分。我只需要在参数中使用" 而不是'。所以,我是说你的这部分评论只是相关的,而不是代码和参数部分中的两种引号。如果你要编辑,否则我不能接受。
  • 呃,你的意思是在我的回答中我应该用单引号而不是双引号(反之亦然),而应该反过来呢?我不确定我是否关注
  • 在您的评论中,您建议使用不同的引号:"。这些在 PyCharm 中被视为 "' 在 bash 中,而 ' 不是。因此," 中带有空格的参数不会在 PyCharm 中拆分。您的主要答案的所有其他部分均不适用。我就是这么说的。
【解决方案3】:

(背景信息)嗯,@cryptonome 的原始评论似乎对我有用,但由于同一用户提供的答案并不完全相同,我总结了对我有用的解决方案。

由于某种原因,PyCharm 在解析参数时会处理不同的单引号 (') 和双引号 (")。用 python 编程这可能看起来自然也可能不自然。无论如何,双引号 (") 似乎在控制台和 PyCharm 中的工作方式完全相同。因此,当使用双引号 (") 传递参数时,预期会出现相同的行为。

在 PyCharm 中应避免使用单引号,但似乎可以在控制台中使用(至少在我的:Ubunut 16.04 中的 bash 中),因为参数拆分发生在空格中,而不是引号边界。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多