Python raw_input в оболочке Google App Engine - PullRequest
1 голос
/ 29 мая 2011

У меня есть программа на Python, которая запускается из командной строки.Он использует raw_input () для чтения строки с клавиатуры пользователя.Я хотел бы сделать программу доступной в Google App Engine и использовать оболочку App Engine , так как она имеет командную строку.

Однако оболочка, похоже, предоставляет "подделку"", и когда я использую raw_input () в моей программе, он просто возвращает EOF.

У вас есть какие-либо советы о том, что использовать вместо raw_input (), или об альтернативных способах создания приложений Python с интерактивной консольюимеется в наличии?(Это не должно быть что-то необычное с проклятиями или что-то в этом роде, просто чтение-буферизованная-строка-строка.)

РЕДАКТИРОВАТЬ: Программа представляет собой онлайн-приключение, подобное Zork http://thcnet.net/error/index.php

Ответы [ 3 ]

2 голосов
/ 29 мая 2011

Исходный код Python для этого приложения доступен в Google Code для изучения или повторного использования. Возможно, raw_input () отключен по соображениям безопасности и всегда возвращает EOF.

Эта оболочка использует интерфейс AJAX и просто извлекает код из области ввода и анализирует его. См. shell.js в хранилище:

/**
 * This is the prompt textarea's onkeypress handler. Depending on the key that
 * was pressed, it will run the statement, navigate the history, or update the
 * current statement in the history.
 *
 * @param {Event} event the keypress event
 * @return {Boolean} false to tell the browser not to submit the form.
 */
shell.onPromptKeyPress = function(event) {
  var statement = document.getElementById('statement');

  if (this.historyCursor == this.history.length - 1) {
    // we're on the current statement. update it in the history before doing
    // anything.
    this.history[this.historyCursor] = statement.value;
  }

  // should we pull something from the history?
  if (event.ctrlKey && event.keyCode == 38 /* up arrow */) {
    if (this.historyCursor > 0) {
      statement.value = this.history[--this.historyCursor];
    }
    return false;
  } else if (event.ctrlKey && event.keyCode == 40 /* down arrow */) {
    if (this.historyCursor < this.history.length - 1) {
      statement.value = this.history[++this.historyCursor];
    }
    return false;
  } else if (!event.altKey) {
    // probably changing the statement. update it in the history.
    this.historyCursor = this.history.length - 1;
    this.history[this.historyCursor] = statement.value;
  }

  // should we submit?
  if (event.keyCode == 13 /* enter */ && !event.altKey && !event.shiftKey) {
    return this.runStatement();
  }
};
1 голос
/ 29 мая 2011

Похоже, что оболочка App Engine не привязывает стандартный ввод к соединению AJAX с браузером, которое используется для обмена командами и результатами.Другими словами, вы не можете использовать его для достижения своей цели.

Вместо того, чтобы показывать интерфейс командной строки через Интернет (что не очень хорошая идея), я бы создал простую оболочку на основе форм,действует как интерфейс для основной программы командной строки.

0 голосов
/ 31 мая 2011

Я решил проблему, превратив программу в генератор.

Пример кода можно найти по адресу https://github.com/larsr/consoleapp

Вы можете попробовать здесь http://pyconsoleapp.appspot.com/

Программа хранится в prog.py и должна была быть немного изменена;заменив raw_input() на выходы, а отпечатки на измененный отпечаток.Обработчик App Engine отправляет входные данные из HTML-формы в генератор с generator.send (входной), который «возвращается» оператором yield.

while True:
    print "What's your name?"
    name = raw_input()
    print "Hello "+name+"!"
    print

необходимо изменить на

from appconsole import myprint, printoutput

def prog_gen(namn=""):

    while True:
        myprint("What's your name?")
        name = yield printoutput()
        myprint("Hello "+name+"!")
        myprint()
...