我试图让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()
答案 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()