【问题标题】:How do I execute a python script that is stored on the internet?如何执行存储在 Internet 上的 python 脚本?
【发布时间】: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()) 来匹配。

标签: python urllib execfile


【解决方案1】:

在 R 中,您可以简单地使用 'source(url)'。这是迄今为止我在 python 中找到的最接近的:

import urllib
(fn,hd) = urllib.urlretrieve('http://host.com/file.py')
execfile(fn)

【讨论】:

  • 如果你看一下这个问题,你会发现 OP 已经有了这个解决方案(+ 一些开销)并且有一个特定的问题。你的回答没有解决这个问题。
猜你喜欢
  • 2013-12-27
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2021-11-17
  • 2016-08-02
  • 2016-04-08
  • 2020-03-23
  • 1970-01-01
相关资源
最近更新 更多