从python调用python-模块导入的持久性?

从python调用python-模块导入的持久性?,python,import,module,Python,Import,Module,所以我有一些Python脚本,我有一个BaseHTTPServer来提供它们的响应。如果请求的文件是.py,那么我将使用execfile(script.py)运行该脚本 问题是:关于进口有什么特别规定吗?一个脚本只需运行一次,最好在请求之间保持它创建的对象的活动状态。我能相信那会发生吗 通过execfile()运行的脚本是否以其他方式运行,或者是否存在任何范围访问问题?execfile方法的文档是。由于没有指定python的特定版本,我将假设我们讨论的是2.6.2 execfile的文档指定它接

所以我有一些Python脚本,我有一个BaseHTTPServer来提供它们的响应。如果请求的文件是.py,那么我将使用execfile(script.py)运行该脚本

问题是:关于进口有什么特别规定吗?一个脚本只需运行一次,最好在请求之间保持它创建的对象的活动状态。我能相信那会发生吗


通过execfile()运行的脚本是否以其他方式运行,或者是否存在任何范围访问问题?

execfile方法的文档是。由于没有指定python的特定版本,我将假设我们讨论的是2.6.2

execfile的文档指定它接受三个参数:文件名、字典(用作局部变量)和第二个字典(用作全局变量)。如果省略第二个和第三个参数,则文件内容将在其自己的作用域(如模块)中运行,该作用域捕获局部变量,但向父作用域公开全局变量。因此,如果文件创建局部变量,它们将不会被保留,但全局变量将被保留

但是,在未指定本地和全局上下文的情况下运行execfile意味着该文件可以看到调用函数的本地和全局上下文。对于您不信任的代码,这应该被视为安全漏洞。通常明智的做法是为局部变量和全局变量创建两个字典,并将它们作为第二个和第三个参数传递给execfile。如果您将这些字典保存在某个位置(例如在另一个由文件名键入的字典中),那么您可以在下次提供文件时重新使用这些字典,这将使文件创建的对象保持活动状态


简而言之,execfile与import并不完全相同。但是您可以保留本地和全局的字典,以保留execfile调用的结果,以便再次使用。

我建议不要使用
execfile
。相反,您可以使用内置的
\uuuu import\uuu
函数将他们请求的python文件作为模块动态导入。下面是我刚刚编写和测试的一个完整的工作示例:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/plain")
        self.end_headers()

        filename = self.path.lstrip("/")
        self.wfile.write("You requested " + filename + "\n\n")
        if filename.endswith(".py"):
            pyname = filename.replace("/", ".")[:-3]
            module = __import__(pyname)
            self.wfile.write( module.do_work() )

HTTPServer(("",8080), Handler).serve_forever()
因此,在本例中,如果有人访问,则会打印“您请求了一些页面”

但是如果您请求,那么文件
some_module.py
将作为Python模块导入,并且将调用该模块中的
do_work
函数。如果这个模块包含代码

def do_work():
    return "Hello World!"
如果您提出请求,则生成的页面将

You requested some_module.py

Hello World!
这应该是处理这类事情的良好起点。另一方面,如果您发现自己需要更高级的web服务器,我强烈推荐