Windows上的Visual Studio代码:如何使用launch.json传递命令行参数?

时间:2019-12-03 18:06:37

标签: cmd visual-studio-code vscode-debugger

从Windows命令行中,我可以成功调用脚本,如下所示:

python spot_check.py "stop|CHST SQ_ARRIVAL|2.3" "stop|14   ST_ARRIVAL|2.6" "19:06:28" "19:15:00"

但是,如果我想使用VS Code调试器,并且使用launch.json中的args属性传递相同的参数

"args": [
    "stop|CHST SQ_ARRIVAL|2.3", 
    "stop|14   ST_ARRIVAL|2.6" ,
    "19:06:28",
    "19:15:00",
]

然后出现以下错误:

(base) c:\Users\1266143\Desktop\stringlines_ml>cd c:\Users\1266143\Desktop\stringlines_ml && cmd /C "set "PYTHONIOENCODING=UTF-8" && set "PYTHONUNBUFFERED=1" && C:\Users\1266143\AppData\Local\Continuum\anaconda3\python.exe c:\Users\1266143\.vscode\extensions\ms-python.python-2019.11.50794\pythonFiles\ptvsd_launcher.py --default --client --host localhost --port 61850 c:\Users\1266143\Desktop\stringlines_ml\spot_check.py "stop|CHST SQ_ARRIVAL|2.3" "stop|14   ST_ARRIVAL|2.6" 19:06:28 19:15:00
"
'CHST' is not recognized as an internal or external command,
operable program or batch file.

读取'CHST' is not recognized as an internal or external command, operable program or batch file.的那部分使我相信|被解释为重定向,而不是字符串文字参数中的字符,以及CHST后的空格表示CHST被解释为命令。但是,为什么这些参数在命令行上的计算结果与在Visual Studio中不同?在调试模式下,如何确保将这些参数正确传递给命令行应用程序?

1 个答案:

答案 0 :(得分:1)

这些不是您要查找的报价

您需要在参数周围加上引号,如直接在命令行上运行脚本/程序(即"stop|CHST SQ_ARRIVAL|2.3")所示

但是在JSON中,当解释JSON时,第一组引号将被剥夺,因此JSON中的字符串"stop|CHST SQ_ARRIVAL|2.3"变成stop|CHST SQ_ARRIVAL|2.3才被馈送到后续流程。

然后将所有参数馈送到命令行或Python解释器,它们看起来像这样(尽管可能会很长,带有一堆调试标志等):

c:/mypath/myfile stop|CHST SQ_ARRIVAL|2.3 stop|14   ST_ARRIVAL|2.6 19:06:28 19:15:00

您认为围绕参数的引号不再存在。这意味着解析器将竖线符号解释为“管道”命令,告诉它第一个命令已完成,并且应该将命令的输出“管道”到随后的命令。

因此,解析器认为您告诉它:

  1. 运行命令c:/mypath/myfile stop
  2. 获取该命令的输出并将其通过管道传递到命令CHST SQ_ARRIVAL
  3. 将该命令的输出放置到命令2.3 stop

由于找不到带有参数CHST的命令SQ_ARRIVAL,因此会向您显示错误消息。


已修复

如果您希望引号最终作为参数的一部分传递,则需要对其进行分层。如何执行此操作取决于JSON解释器将如何处理多组引号(我不确定它是如何执行的。)

一些尝试:

  1. 使用三引号:"""stop|CHST SQ_ARRIVAL|2.3"""-在某些解析器中,当看到第一个引号时,它将启动一个字符串,但是如果之后连续看到2个引号,则将其变成一个引号字符串,而不是结尾。因此,第一个和最后一个引号在字符串的开头和结尾,而另外两对引号将被压缩为参数外部的引号

  2. 在JSON字符串内的引号之前使用反斜杠:"\"stop|CHST SQ_ARRIVAL|2.3\""-在许多解析器中,反斜杠字符是“转义”字符,紧随其后的任何字符都被视为字符串文字,即使通常是特殊字符也可以直接放入字符串中。

  3. 在字符串中使用单引号:"'stop|CHST SQ_ARRIVAL|2.3'"-由于Python可以将单引号或双引号用作字符串,因此通常将使用单引号的任何传递给python解释器的参数都视为字符串。但是,在这种情况下,我不确定参数是否会达到这个程度,它们可能首先会被外壳程序解释,这可能不会将单引号视为字符串的开头(但您永远不确定。) )。

哪种方法有效取决于您所使用的Shell(即Windows命令提示符,Powershell,Git Bash,sh,c-sh等)。他们每个人对命令行的字符串解释都不同。

如果这些都不起作用,并且知道了根本原因,则应进行进一步搜索以找到答案。祝你好运!