Popen Command Prompt странное поведение - PullRequest
0 голосов
/ 20 октября 2019

Я возился с subprocess.Popen и попал в странную ситуацию, которую я просто не могу объяснить. Оставляя здесь, в надежде, что кто-то сможет понять это.

Описание

Создание подпроцесса cmd.exe из процесса python приводит к быстрому переключению с python на cmd. И когда отображается приглашение python, команда выполняется в cmd.exe. С другой стороны, когда отображается приглашение cmd.exe, ввод команды выполняется в оболочке python.

Получение этого странного запроса туда-сюда. Пример выглядит следующим образом:

Microsoft Windows [Version 10.0.17134.829]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\Pedro Rodrigues>help
Type help() for interactive help, or help(object) for help about object.
>>>

Видимо, командная строка Windows. Но не только команда help является командой python, после чего мы, кажется, попадаем в оболочку python.

Но, если мы сделаем это снова. На самом деле все наоборот. Теперь это командная строка Windows, но нам предоставляется приглашение python!

>>> help
For more information on a specific command, type HELP command-name
ASSOC          Displays or modifies file extension associations.
... supressed ...
WMIC           Displays WMI information inside interactive command shell.

For more information on tools see the command-line reference in the online help.

C:\Users\Pedro Rodrigues>

И это продолжается, насколько я могу сказать, терминал на данный момент практически бесполезен.

Шаги для воспроизведения

  1. Откройте оболочку python:

    • Откройте командную строку и введите python.
    • Откройте оболочку Python.
  2. Запустите следующий код:

import subprocess
subprocess.Popen('cmd.exe')
  1. Тип help, нажмитеENTER.
  2. Повторите предыдущий шаг.

Что происходит?

Я удивлен результатом. С учетом сказанного я просто не могу объяснить, что здесь происходит.

В Linux

Поведение немного отличается, хотя оно также делает терминал бесполезным. Я не много играл с ним в Linux, но в действительности несколько раз получал работающий терминал.

import subprocess
subprocess.Popen('/bin/bash')

Но в большинстве случаев получал рабочую оболочку bash. Который останавливал процесс Python каждый раз.

Я понимаю, что это эзотерический сценарий, но то, что происходит в Windows, озадачивает меня.

...