У меня есть программа 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
Источник 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();
}
};
Похоже, что оболочка App Engine не привязывает stdin к соединению AJAX с браузером, который используется для обмена командами и результатами. Другими словами, вы не можете использовать его для достижения своей цели.
Вместо того, чтобы выставлять интерфейс командной строки через Интернет (что не похоже на хорошую идею), я бы создал простую оболочку на основе form-, которая действует как конец front- для базовой строки command- программа.
Я решил проблему, превратив программу в генератор.
Пример кода можно найти на 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()