pycharm和控制台中的参数解析不同

时间:2018-10-01 09:52:25

标签: python shell 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'
  Arg#3:argument2

控制台中运行:

  

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

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

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

我正在使用Ubuntu 16.04。

3 个答案:

答案 0 :(得分:0)

您抱怨的是外壳问题。外壳程序使用其单引号的约定来解析参数。实际上,我发现PyCharm行为是可以理解和一致的。如果不涉及任何外壳,那么没人会做您期望的工作。

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

另请参见here,以获取对日期和日期仍然正确的命令行参数的一般说明,具体来说:

  

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

     

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

答案 1 :(得分:0)

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

要避免PyCharm在解释argument 1中的python3 argumnents_tester.py 'argument 1' argument2部分(作为 2个参数)时表现出的行为,请在代码中使用另一种引号, "的双引号str.format()和run命令中的参数的单引号'

PS
尽管这似乎是一个简单的解决方法,但我确实认为,如果有可能在任何其他系统中执行该代码,则应该选择遵守系统外壳程序最常见/广为接受的标准行为( bash,zsh, sh ,任何* nix风格)来解释传递的参数,而不是PyCharm的实现。这样,代码将具有更大的可移植性,并且用户不必找出其他方法来传递/提供参数。
因此,我无法保证除了通过@Eypros系统编写和配置的特定代码以外,这种方法还可以工作。

答案 2 :(得分:0)

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

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

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