Передача по каналу Python в Windows: Почему это не работает?

Вы можете использовать Object.keys для получения ключей перечисления и записи значений, например:

enum Sizes {
  Tiny = "Tiny",
  VerySmall = "Very Small",
  Small = "Small",
  Medium = "Medium",
  Large = "Large",
  VeryLarge = "Very Large"
}

for (const size of Object.keys(Sizes)) {
    console.log(Sizes[size]);
}

Вывод:

Tiny
Very Small
Small
Medium
Large
Very Large

Прозрачный пример:

[119 ]
var Sizes;
(function (Sizes) {
    Sizes["Tiny"] = "Tiny";
    Sizes["VerySmall"] = "Very Small";
    Sizes["Small"] = "Small";
    Sizes["Medium"] = "Medium";
    Sizes["Large"] = "Large";
    Sizes["VeryLarge"] = "Very Large";
})(Sizes || (Sizes = {}));
for (var _i = 0, _a = Object.keys(Sizes); _i < _a.length; _i++) {
    var size = _a[_i];
    console.log(Sizes[size]);
}

11
задан Community 23 May 2017 в 11:52
поделиться

3 ответа

Я протестировал это на своей машине Windows, и она работает при определении Python exe:

C:\>C:\Python25\python.exe output.py | C:\Python25\python.exe input.py
Give me the greeting. The greeting is: hello

Но я получаю EOFError также при выполнении команд непосредственно как:

output.py | input.py 

Я не уверен точно, почему то есть, я все еще изучаю этого, но по крайней мере это должно предоставить Вам обходное решение на данный момент. Это может иметь некоторое отношение к способу, которым обработчик файлов вызывается для .py файлов.

ОБНОВЛЕНИЕ: хорошо, что Вы знаете. Похож это - на самом деле ошибка в Windows, где stdin/stdout перенаправление не может работать правильно при запуске с ассоциации файлов. Таким образом, обходное решение как отмечено один и Patrick, необходимо указать, что "Python" будет выполнять input.py, иначе это не перенаправит stdout от output.py до stdin для input.py правильно.

Ссылка:

http://mail.python.org/pipermail/python-bugs-list/2004-August/024923.html

http://support.microsoft.com/default.aspx?kbid=321788

ОБНОВЛЕНИЕ 2:

Изменить это поведение и сделать Windows передают работу по каналу как ожидалось для stdin/stdout перенаправления, можно добавить это значение к реестру (протестированный на моем поле, и проверил, что это работает, как желаемый).

  1. Запустите редактор реестра.
  2. Найдите и затем нажмите следующий ключ в реестре:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

  3. В меню Edit нажмите Add Value и затем добавьте следующее значение реестра:

    Имя значения: InheritConsoleHandles
    Тип данных: REG_DWORD
    Основание: десятичное число
    Данные значения: 1

  4. Редактор реестра выхода.

23
ответ дан 3 December 2019 в 03:37
поделиться

Измените его на:

Output.py | python Input.py

Вывод будет:

Дайте мне приветствие. Приветствие:здравствуйте!

4
ответ дан 3 December 2019 в 03:37
поделиться

Вот то, почему Вы получаете EOFError (из документации относительно raw_input):

Функция затем читает строку из входа, преобразовывает его в строку (разделяющий запаздывающую новую строку), и возвраты это. Когда EOF читается, EOFError повышен.

http://docs.python.org/library/functions.html?highlight=raw_input#raw_input

Можно хотеть использовать sys.stdin, он обеспечивает объект файла, от которого можно использовать чтение, readlines методы.

import sys
for greeting_line in sys.stdin.readlines():
    print "The greeting is:", greeting_line.strip()
0
ответ дан 3 December 2019 в 03:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: