我试图能够动态运行python代码,变量可以传递给代码。在将我的项目添加到谷歌应用引擎环境之前,我能够在我的计算机上执行此操作(因为我可以访问所有文件,但现在,使用谷歌应用引擎,我不能这样做。
我正在努力寻找这个问题的解决方案。它不需要过于花哨,只需发送变量并获取html,以及脚本能够被添加到客户端(关键部分)到任何使用的数据库方法。
修改 基本上我的意思是动态是这样我可以导入(或者那就是我在IDLE测试原型时做的,解决方案可能不会被称为导入)一个python脚本,库的名称存储在一个变量中,以及将要添加的未知数量的变量。我让它在Idle上工作,但现在我需要让它在谷歌应用程序引擎环境中工作,人们也需要能够上传脚本(这是导致更多问题的主要问题)
修改 当我说我设法在我的本地机器上运行时,我的意思是我能够手动将脚本拖放到与我的主脚本相同的目录中。稍后该脚本将在必要时导入并执行脚本。我能够使用以下代码使用它:
#calling function
mod = __import__('actions.'+folder+'.'+FILE)
VAR = getattr(getattr(mod, folder), FILE)
response = VAR.Main()
print response
此代码适用于我的笔记本电脑和Google应用引擎环境,但是当我尝试向目录添加更多脚本时,事情就会出现问题。在我的笔记本电脑上,我可以通过这种或那种方式移动文件,因为我可以完全访问文件目录。在Google App引擎上,我无法将文件上传到其余python脚本的同一目录或子目录中。因此,当尝试设计一种允许更多代码进入系统的方法(在我的情况下,添加更多'插件')时,基本上会出现问题。
答案 0 :(得分:2)
答案是exec语句(也称为exec()函数)或eval()函数。请参阅http://docs.python.org/reference/simple_stmts.html#the-exec-statement和http://docs.python.org/library/functions.html?highlight=eval#eval。这些可以从字符串执行任意Python代码。 exec()运行一个脚本,你会得到副作用; eval()接受一个表达式并返回其值。通常,您将输入作为变量传递到本地名称空间中。
答案 1 :(得分:1)
好的,所以我最终做的是使用数据存储区上传所有内容,例如名称,描述,上传者和插件的代码(现在代码只是输入到textarea框中)。然后,我不是像我以前从桌面运行所有内容那样导入位于我的代码的同一目录下的文件夹中的文件,而是使用这一点魔法将明文代码导入模块中:
#Initiating Variables for use by importing functions
module_name = 'mymod'
filename = 'action_file'
source = PossibleMatches[0][1] #the source code from the best matched option
# define module_name somewhere
import types
module = types.ModuleType(module_name)
# source should the code to execute
# filename should be a pseudo-filename that the code's from
# (it doesn't actually have to exist; it's used for error messages)
code_object = compile(source, filename, 'exec')
#execute the code in the context of the module
exec code_object in module.__dict__
#Executing the 'Main' Function from the code
return module.Main()