我需要将python代码存储在数据库中并将其加载到某种bootstrap.py应用程序中以便执行。我不能使用文件系统因为我使用的是GAE,所以这是我唯一的选择。
但是我不是经验丰富的python用户。
我已经能够加载1行代码并使用eval运行它,但是一行代码包含两行或更多行代码会给我一个“无效语法”错误。
我也在考虑是否可以扩展“import”加载器来实现数据库加载。
谢谢!
答案 0 :(得分:4)
在阅读了有关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()
=======================
答案 1 :(得分:2)
我有点赞同上面的评论员,这听起来有点危险。但是:
我使用App Engine控制台(http://con.appspot.com/console/)进行了一些实验,而eval()
确实倾向于抛出SyntaxError
。
相反,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
语句,但要记住直接来自最终用户的许多(很多!)代码的危险。
答案 2 :(得分:2)
如果你想要一个更健壮的机制,你可能想阅读描述输入挂钩的PEP302。您可以使用它们来导入代码而不必对其进行评估。