#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()