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

Visual Studio Code on Windows: How can I pass command line arguments using launch.json?

从 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:\Users66143\Desktop\stringlines_ml>cd c:\Users66143\Desktop\stringlines_ml && cmd /C "set "PYTHONIOENCODING=UTF-8" && set "PYTHONUNBUFFERED=1" && C:\Users66143\AppData\Local\Continuum\anaconda3\python.exe c:\Users66143\.vscode\extensions\ms-python.python-2019.11.50794\pythonFiles\ptvsd_launcher.py --default --client --host localhost --port 61850 c:\Users66143\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. 的部分让我相信 | 被解释为重定向,而不是字符串文字参数中的字符,并且 space后面的 CHST 表示 CHST 被解释为命令。但是,为什么这些参数在命令行中的计算结果与在 Visual Studio 中的计算结果不同?在调试模式下如何确保将这些参数正确传递到我的命令行应用程序?

这些不是您要查找的报价

您需要在参数周围加上引号,如直接在命令行上 运行 script/program 时所示(即 "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

您认为围绕论点引用的引语已不复存在。这意味着解析器将竖线符号解释为 "Pipe" 命令,这告诉它第一个命令已完成,它应该将该命令的输出和 "pipe" 输出到后面的命令.

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

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

由于找不到带有参数 SQ_ARRIVAL 的命令 CHST,它会给出您所看到的错误消息。


修复在

如果您希望引号最终作为论点的一部分传递,您需要将它们分层。如何做到这一点取决于 JSON 解释器将如何处理多组引号(我不确定它是如何处理的)。

一些尝试:

  1. 使用三引号:"""stop|CHST SQ_ARRIVAL|2.3""" - 在一些解析器中,当它看到第一个引号时它开始一个字符串,但如果它在后面的一行中看到 2 个引号,它使它们进入字符串内的引号,而不是结束它。所以第一个和最后一个引号开始和结束字符串,而其他两对引号将被压缩成你的参数外面的引号

  2. 在 JSON 字符串中的引号前使用反斜杠:"\"stop|CHST SQ_ARRIVAL|2.3\"" - 在许多解析器中,反斜杠字符是 "escape" 字符和任何字符在它被认为是将直接放入字符串中的字符串文字之后,即使它通常是一个特殊字符。

  3. 在字符串中使用单引号:"'stop|CHST SQ_ARRIVAL|2.3'" - 由于 Python 可以使用单引号或双引号作为字符串,通常任何参数都指向 python 带有单引号的解释器也将被视为字符串。但是,我不确定在这种情况下参数是否会走那么远,它们可能会首先被 shell 解释,这可能不会将单引号视为字符串的开头(但你永远不知道当然..).

哪种方法有效可能取决于您使用的 shell(即 Windows 命令提示符、Powershell、Git Bash、sh、 c-sh 等)。他们每个人都可以不同地处理字符串的命令行解释。

如果这些 none 有效,知道根本原因,进一步搜索应该会找到答案。祝你好运!