【发布时间】:2013-07-02 08:39:09
【问题描述】:
我正在将 python 2.4 用于从 Internet 导入脚本并执行它们的程序,以便作者可以更改脚本,而用户不必重新下载脚本。
这是下载脚本的程序部分:
def downloadScript(self,script):
myfile=open('#A file path/'+script['name']+'.txt','w')
try:
downloadedScript=urllib.urlopen(script['location']).read()
except:
#raise error
return
myfile.write(downloadedScript)
myfile.close()
def loadScript(self):
if not self.scriptCurrentlyLoaded:
script=self.scripts[self.scroller.listPos]
if script['location']=='None':
#raise error
return
self.downloadScript(script)
myfile=open('#A file path/'+script['name']+'.txt','r')
for line in myfile:
if line.startswith('from') or line.startswith('import'):
exec(line.strip()) #This was added because of the name errors
#being produced but to no affect
myfile.close()
execfile('#A file path/'+script['name']+'.txt')
self.scriptCurrentlyLoaded=True
self.scriptLoaded=script
else:
#raise error
非常奇怪的是,当我跑步时
execfile(script path)
在函数之外,脚本下载后,脚本正确执行。但是尝试运行 loadScript 函数会在脚本中引发名称错误,即使名称已被导入脚本中并且在我觉得很奇怪的 execfile 之前。
所以我的问题是:我是否使用了非常糟糕的方法来下载和执行这些脚本?
对不起,如果这个问题之前已经回答过,但我似乎找不到其他人试图通过从互联网下载 python 脚本来运行它们。
编辑:将globals 作为另一个参数添加到execfile 似乎暂时解决了这个问题。不过不知道以后会不会出现其他问题。
【问题讨论】:
-
请注意,在 downloadScript 中,您可能会在
urlopen引发异常的情况下打开文件而不关闭它。 -
您知道,将下载的脚本保存到文件中并不是强制性的:您可以使用 eval 来评估包含代码的字符串。另外,我希望你在做什么并不重要,因为从外部源执行任意代码而不先检查它是非常危险的。
-
@BrandonInvergo 在这种情况下,当我遇到这些问题时,我会解决这些问题,但目前脚本的导入是程序的主要功能,所以如果没有它,程序将毫无用处,但是是的,我会解决的。
-
@georgesl 运行 eval(downloadScript) 文件“
”时,第 1 行导入随机 ^ SyntaxError:语法无效。是否要添加他们不信任的作者制作的脚本也取决于程序的用户。 -
也许您想将 exec(line.strip()) 更改为 exec(line.strip(), globals) 以便将导入附加到全局命名空间。同样,可能想将 execfile('#A file path/'+script['name']+'.txt') 更改为 execfile('#A file path/'+script['name']+'.txt' , globals()) 来匹配。