Могу ли я включить точки останова, если я запускаю из окна терминала?

Фактически в Windows он использует cmd.exe, когда shell=True - он добавляет cmd.exe /c (он фактически ищет переменную среды COMSPEC, но по умолчанию имеет значение cmd.exe, если нет) аргументам оболочки. (В Windows 95/98 он использует промежуточную программу w9xpopen для фактической запуска команды).

Таким образом, странная реализация на самом деле является UNIX, которая делает следующее (где каждое пространство разделяет другой аргумент):

/bin/sh -c gcc --version

Похоже, правильная реализация (по крайней мере, в Linux) была бы:

/bin/sh -c "gcc --version" gcc --version

Поскольку это установило бы командную строку из котируемых параметров , и успешно передайте другие параметры.

Из раздела sh man-страницы для -c:

Read commands from the command_string operand instead of from the standard input. Special parameter 0 will be set from the command_name operand and the positional parameters ($1, $2, etc.) set from the remaining argument operands.

Этот патч довольно просто выполняет трюк:

--- subprocess.py.orig  2009-04-19 04:43:42.000000000 +0200
+++ subprocess.py       2009-08-10 13:08:48.000000000 +0200
@@ -990,7 +990,7 @@
                 args = list(args)

             if shell:
-                args = ["/bin/sh", "-c"] + args
+                args = ["/bin/sh", "-c"] + [" ".join(args)] + args

             if executable is None:
                 executable = args[0]
0
задан Delta39 19 March 2019 в 12:37
поделиться