Python - 在Python Web服务器中加载模块

时间:2011-11-07 19:07:12

标签: python windows module webserver

我试图让Python加载一个模块,取决于从浏览器请求的页面,如果.py文件位于脚本的根目录中,我可以使用它,但是如果它位于脚本中,它似乎无法正常工作子目录。

html文件无处不在,如果有人可以帮助我从任何目录中获取python文件,我很感激。

我在win 7 64bit SP1上运行Python 2.7

import string,cgi,time
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import os
import mimetypes

#import pri
port = 888
host = "0.0.0.0"

class MyHandler(BaseHTTPRequestHandler):

def do_GET(self):
    try:
        #RequestedURL = self.path
        mimeType = mimetypes.guess_type(self.path)[0]
        fileType = mimetypes.guess_extension(mimeType)
        infoList = [mimeType, fileType]

        if infoList[1] != ".py":
            self.send_response(200)
            self.send_header('Content-type', mimeType)
            self.end_headers()
            f = open(curdir + sep + self.path, "rb")
            self.wfile.write(f.read())
            f.close()
            return

        if fileType == ".py":
            pythonFilename = self.path.lstrip("/")
            self.send_response(200)
            self.send_header('Content-type',    'text/html')
            self.end_headers()
            pyname = pythonFilename.replace("/", ".")[:-3]
            print pythonFilename
            print pyname
            temp1 = pyname.split(".")
            temp2 = temp1[-1]
            print temp2
            module = __import__(root.index)
            self.wfile.write(module.root.index.do_work())
            #module = __import__("test.index")
            #self.wfile.write( module.index.do_work())
            return

        return

    except IOError:
        self.send_error(404,'File Not Found: %s' % self.path)


def do_POST(self):
    global rootnode
    try:
        ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
        if ctype == 'multipart/form-data':
            query=cgi.parse_multipart(self.rfile, pdict)
        self.send_response(301)

        self.end_headers()
        upfilecontent = query.get('upfile')
        print "filecontent", upfilecontent[0]
        self.wfile.write("<HTML>POST OK.<BR><BR>");
        self.wfile.write(upfilecontent[0]);

    except :
        pass

def main():
try:
    server = HTTPServer((host, port), MyHandler)
    print 'started httpserver:'
    print  ("Host: "  + (host))
    print  ("Port: "  + str(port))

    server.serve_forever()
except KeyboardInterrupt:
    print '^C received, shutting down server'
    server.socket.close()

if __name__ == '__main__':
main()

1 个答案:

答案 0 :(得分:2)

要做的第一件事是确保子目录中有一个名为

的文件
__init__.py

在里面。此文件可以为空,但如果没有它,您将无法进行导入。然后,您应该知道,如果您从子目录导入,则必须包含类似

的内容
module = __import__("subdirectory.jack2")

也就是说,在导入模块时,您需要包含模块存储在其中的子目录的名称。

如果要从不是您正在使用的目录的子目录的目录导入,则必须确保它包含在python路径中。您可以通过导入sys.path模块设置sys来修改路径,并在存储模块的位置附加新路径:

import sys
sys.path.append("full/path/to/directory/to/import/from")

修改以回应评论:

使用builtin function __import__时,重要的是要意识到它会返回顶级模块,而不是您要导入的模块。因此,如果您想访问刚导入的模块,则需要执行以下操作:

module = __import__("mymodule")
result = module.mymodule.myfunction()