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

#python #google-app-engine #console-application

#python #google-app-engine #консольное приложение

Вопрос:

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

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

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

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

Ответ №1:

Исходный код 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 amp;amp; event.keyCode == 38 /* up arrow */) {
    if (this.historyCursor > 0) {
      statement.value = this.history[--this.historyCursor];
    }
    return false;
  } else if (event.ctrlKey amp;amp; 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 */ amp;amp; !event.altKey amp;amp; !event.shiftKey) {
    return this.runStatement();
  }
};
  

Ответ №2:

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

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

Ответ №3:

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

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

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

Программа хранится в prog.py и должен был быть немного изменен; заменив raw_input() на yields и the prints на измененный print. Обработчик 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()