Мне нужно хранить код Python в базе данных и загружать его в какое-то приложение bootstrap.py для выполнения. Я не могу использовать файловую систему, потому что я использую GAE, так что это мой единственный выбор.
Однако я ' Я не опытный пользователь Python.
Я уже смог загрузить 1 строку кода и запустить ее с помощью eval, однако фрагмент кода с двумя или более строками дал мне ошибку «неверный синтаксис».
I ' Я также думаю, возможно ли расширить загрузчик «import» для реализации загрузки БД.
Спасибо!
Если вам нужен более надежный механизм, вы, вероятно, захотите прочитать PEP302 , в котором описаны ловушки ввода. Вы можете использовать их для импорта кода, а не для его оценки.
Мне удалось сделать что я задумал, прочитав больше о загрузке динамического кода Python.
Вот пример кода. Я удалил заголовки, чтобы быть светлее:
Все равно спасибо!
=============
class DynCode(db.Model):
name = db.StringProperty()
code = db.TextProperty(default=None)
=============
class MainHandler(webapp.RequestHandler):
def get(self):
dyn = DynCode()
dyn = "index"
dyn.code = """
from google.appengine.ext import webapp
class MainHandler(webapp.RequestHandler):
def get(self):
self.response.out.write("Hello World\\n")
self.response.out.write("Hello World 2\\n")
"""
dyn.put()
self.response.out.write("OK.")
def main():
application = webapp.WSGIApplication([('/update', MainHandler)], debug=True)
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
=============== ===================
def main():
query = DynCode.all()
dyncodes = query.fetch(1)
module = imp.new_module('mymodule')
for dyn in dyncodes:
exec dyn.code in module.__dict__
application = webapp.WSGIApplication([('/', module.MainHandler)], debug=True)
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
=======================
Я частично согласен с вышеприведенными комментаторами, это звучит довольно опасно. Однако:
Я немного поэкспериментировал с Консолью App Engine ( http://con.appspot.com/console/ ), а eval ()
действительно имел тенденцию бросать ] SyntaxError
's.
Вместо этого оператор exec
может быть вашим другом ( http://docs.python.org/release/2.5.2/ref/exec.html ).
Мне удалось запустить это в консоли App Engine:
>>> exec "def f(x):\n x = x + 1\n y = 10\n return x + y"
>>> f(10)
21
Так что попробуйте оператор exec
, но помните о многих, многих (многих!) Опасностях кода, исходящих непосредственно от конечных пользователей.