Python raw_input в оболочке Google App Engine

1

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

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

Есть ли у вас какие-либо советы по использованию вместо raw_input() или альтернативных способов создания интерактивных приложений для пула python? (Это не должно быть причудливым бичем или чем-либо, просто read- a- buffered- string-.)

EDIT: программа представляет собой онлайн-приключение, такое как Zork http://thcnet.net/error/index.php

Теги:
console-application
google-app-engine

3 ответа

2

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

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

/**
 * This is the prompt textarea 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

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

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

0

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

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

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

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

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

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

from appconsole import myprint, printoutput

def prog_gen(namn=""):

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню