Python - модуль загрузки в веб-сервере Python - PullRequest
0 голосов
/ 07 ноября 2011

я пытаюсь заставить Python загрузить модуль в зависимости от того, какая страница запрашивается из браузера, у меня это работает, если файл .py находится в корне скрипта, но, похоже, не может заставить его работать, если он подкаталог.

html-файлы работают везде, я был бы признателен, если бы кто-нибудь помог мне заставить работать файлы python из любой директории.

я использую Python 2.7 на win 7 64bit SP1

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 Ответ

2 голосов
/ 07 ноября 2011

Первое, что нужно сделать, это убедиться, что в подкаталоге есть файл с именем

__init__.py

в нем. Этот файл может быть пустым, но вы не сможете выполнить импорт без него. Затем вы должны знать, что если вы импортируете из подкаталога, вам нужно будет включить что-то вроде

module = __import__("subdirectory.jack2")

То есть вам нужно будет указывать имя подкаталога, в котором хранится модуль, при импорте модуля.

Если вы хотите импортировать из каталога, который не является подкаталогом того каталога, в котором вы работаете, вам нужно убедиться, что он включен в путь к Python. Вы можете изменить путь, установив sys.path, просто импортировав модуль sys и добавив новый путь к месту хранения ваших модулей:

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

Редактировать в ответ на комментарии:

При использовании встроенной функции __import__ важно понимать, что она возвращает модуль верхнего уровня, а не тот, который вы хотите импортировать. Итак, если вы хотите получить доступ к только что импортированному модулю, вам нужно сделать что-то вроде этого:

module = __import__("mymodule")
result = module.mymodule.myfunction()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...