当我发现它与控制台的行为有所不同时,我试图通过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。
答案 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 中),因为参数拆分发生在空格而不是引号边界。