如何将包含空格或引号的脚本参数传递给 PyCharm?

use*_*956 5 python intellij-idea

我可以运行(对于命令行)

myscript.py '--pm execute.shell(cmd="ls -l", nonInteractive=True)'
Run Code Online (Sandbox Code Playgroud)

但是,假设我要调试 myscript.py 并将“编辑配置 Python”对话框中的“脚本参数:”字段设置为:

--pm execute.shell(cmd="ls -l", nonInteractive=True)
Run Code Online (Sandbox Code Playgroud)

它在“ls”和“-l”之间的空格处呕吐。有没有办法解决这个问题?使用 ' 或 " 引号似乎不是这样做的:

--pm 'execute.shell(cmd="ls -l", nonInteractive=True)'
--pm "execute.shell(cmd='ls -l', nonInteractive=True)"
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,引号都以参数结尾。


更新:运行:

import sys
for x in sys.argv:
    print "<%s>"%(x,)
Run Code Online (Sandbox Code Playgroud)

Script parameters: a  \ b " c" "\ d" ' e' '\ f' "a 'b' \"c\""
Run Code Online (Sandbox Code Playgroud)

给出:

<cmd.py>
<a>
<\>
<b>
< c>
<\ d>
<'>
<e'>
<'\>
<f'>
<a 'b' "c">
Run Code Online (Sandbox Code Playgroud)

所以它看起来像:

  • 忽略转义(从字面上处理\),除了前面的“
  • 一个非转义的 " 开始一个可能包含空格的块
  • ' 按字面处理

所以,神奇的答案是:

Script parameters:  --pm "execute.shell(cmd='ls -l', nonInteractive=True)"
Run Code Online (Sandbox Code Playgroud)

或者

Script parameters:  --pm "execute.shell(cmd=\"ls -l\", nonInteractive=True)"
Run Code Online (Sandbox Code Playgroud)

Aks*_*rit 2

我对这个问题不是100%确定。由于我没有评论权限,所以我将其写为答案。

将“ls -l”更改为“ls-\ l”应该可以工作,至少在 *nix 系统上是这样。

相关文档/错误报告位于https://youtrack.jetbrains.com/issue/PY-4715https://youtrack.jetbrains.com/issue/IDEA-72632,其中指出您需要使用系统依赖来转义空间方法,而不是使用通用方法。通用系统独立方法的提议显然被拒绝了。

编辑: --pm" "execute.shell(cmd=\"ls" "-l\"," "nonInteractive=True) 有效。

  • 根据 pycharm 文档,似乎必须将空格输入为内部引号,并将引号输入为 \。这似乎是很奇怪的选择。网址是 https://www.jetbrains.com/pycharm/help/run-debug-configuration-python.html (4认同)