Ввод Python блокируется при вызове из пакета в течение «если» и после «тайм-аута» - PullRequest
0 голосов
/ 23 мая 2018

Минимальный рабочий пример:

test.bat:

@echo off
if 0==0 (
  timeout 3
  python test.py
)

test.py:

input('press ENTER to exit')

В cmd.exe:

call test.bat
> Waiting for 0 seconds, press a key to continue ...
> press ENTER to exit_

Тогда он застрял в операторе ввода.Если я продолжу нажимать Enter, это в конечном счете вызовет исключение:

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    input('press ENTER to exit')
OSError: [WinError 8] Not enough storage is available to process this command

Я нахожусь на Windows 7 SP1, попробовал это с

  • Python 3.6 (64-бит)
  • Python 3,6 (32-разрядный)
  • Python 3,5 (32-разрядный)
  • Python 2,7 (32-разрядный) (в этом случае он застрял навсегда, не вызывая исключение)

Может кто-нибудь воспроизвести это и / или иметь какое-либо представление, где это пошло не так?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Да, я могу воспроизвести поведение, которое вы наблюдали в Windows 7 с Python 2.6 и Python 2.7, но не в Windows 10 с Python 2.7.Размеры файлов timeout.exe отличаются в Windows 7 и Windows 10, поэтому в этой команде произошли изменения.

Я считаю, что timeout портится с указателем файла в STD_IN stream (дескриптор 0), особенно потому, что он перемещает указатель для отображения обратного отсчета секунд (см. эту ветку: Очистите линию / переместите курсор, используя команду Timeout или аналогичную ).

Проблема возникает не только вместе с командой if, она возникает, как только timeout и вызов скрипта Python находятся в одном блоке кода, заключенном в скобки:

(
    timeout 3
    python test.py
)

та же проблема возникает, когда они находятся в одной строке:

timeout 3 & python test.py

Когда две командные строки находятся в отдельных строках без скобок, все работает нормально:

timeout 3
python test.py

Как только *Команда 1023 * заменена на pause, которая также читает из STD_IN , все работает как положено:

(
    pause
    python test.py
)

Или также:

pause & python test.py

michael_heath уже предоставленохороший обходной путь в его ответ с использованием ping.Однако это не может быть прервано нажатием клавиши, например timeout (поэтому оно фактически эквивалентно timeout 3 /NOBREAK).

0 голосов
/ 25 мая 2018

Я могу воспроизвести проблему в Windows 7 с Python 3.6.5 64 бит.

Несколько альтернатив, чтобы избежать проблемы с timeout:

@echo off
if 0==0 (
  echo Pause for 3 seconds
  ping -n 3 localhost >nul
  python test.py
)
exit /b

Это использует ping, которая не вызывает проблем.

@echo off
if 0==0 (
  timeout 3
  call :run_python test.py
)
exit /b

:run_python
python %*
exit /b

При этом используется метка с именем :run_python, которая позволяет интерпретатору запускать Python вне контекста скобок.Все аргументы, переданные после вызываемой метки, будут переданы python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...