我是Python的新手,我一直在研究如何从目录/子目录导入我的自定义模块。例如this和this。
这是我的结构,
index.py
__init__.py
modules/
hello.py
HelloWorld.py
moduletest.py
index.py,
# IMPORTS MODULES
import hello
import HelloWorld
import moduletest
# This is our application object. It could have any name,
# except when using mod_wsgi where it must be "application"
def application(environ, start_response):
# build the response body possibly using the environ dictionary
response_body = 'The request method was %s' % environ['REQUEST_METHOD']
# HTTP response code and message
status = '200 OK'
# These are HTTP headers expected by the client.
# They must be wrapped as a list of tupled pairs:
# [(Header name, Header value)].
response_headers = [('Content-Type', 'text/plain'),
('Content-Length', str(len(response_body)))]
# Send them to the server using the supplied function
start_response(status, response_headers)
# Return the response body.
# Notice it is wrapped in a list although it could be any iterable.
return [response_body]
init .py,
from modules import moduletest
from modules import hello
from modules import HelloWorld
模块/ hello.py,
def hello():
return 'Hello World from hello.py!'
模块/ HelloWorld.py,
# define a class
class HelloWorld:
def __init__(self):
self.message = 'Hello World from HelloWorld.py!'
def sayHello(self):
return self.message
模块/ moduletest.py,
# Define some variables:
numberone = 1
ageofqueen = 78
# define some functions
def printhello():
print "hello"
def timesfour(input):
print input * 4
# define a class
class Piano:
def __init__(self):
self.type = raw_input("What type of piano? ")
self.height = raw_input("What height (in feet)? ")
self.price = raw_input("How much did it cost? ")
self.age = raw_input("How old is it (in years)? ")
def printdetails(self):
print "This piano is a/an " + self.height + " foot",
print self.type, "piano, " + self.age, "years old and costing\
" + self.price + " dollars."
但是通过Apache WSGI,我收到了这个错误,
[wsgi:error] [pid 5840:tid 828] [client 127.0.0.1:54621] import 你好[wsgi:错误] [pid 5840:tid 828] [客户端127.0.0.1:54621] ImportError:没有名为hello的模块
知道我做错了什么?
修改
index.py
__init__.py
modules/
hello.py
HelloWorld.py
moduletest.py
User/
Users.py
答案 0 :(得分:6)
您应该在__init__.py
目录中有一个modules/
文件,告诉Python modules
是package。它可以是一个空文件。
如果您愿意,可以将其添加到__init__.py
以简化导入软件包的模块:
__all__ = ['hello', 'HelloWorld', 'moduletest']
现在当用户从
sound.effects import *
写信时会发生什么? 理想情况下,人们希望这会以某种方式传递给文件系统, 查找包中存在哪些子模块,然后导入它们 所有。这可能需要很长时间,导入子模块可能会有 不希望的副作用,只有在子模块出现时才会发生 明确导入。唯一的解决方案是让包作者提供一个明确的 包的索引。 import语句使用以下内容 约定:如果包的
__init__.py
代码定义了一个名为的列表__all__
,它被视为遇到from package import *
时应导入的模块名称列表。这取决于 包的作者在新版本的时候保持这个列表是最新的 包发布。包裹作者也可能决定不支持 它,如果他们没有看到从他们的包中导入*
的用途。
答案 1 :(得分:2)
您需要在.wsgi文件中设置应用程序的路径,在您的情况下,它似乎是index.py
:
import sys
path = '/full/path/to/app'
if path not in sys.path:
sys.path.insert(0, path)
答案 2 :(得分:1)
您也可以在apache virtualhost config中修复此问题:
WSGIDaemonProcess example home=/path/to/mysite.com python-path=/path/to/mysite.com
有关详细信息,请参阅http://blog.dscpl.com.au/2014/09/python-module-search-path-and-modwsgi.html。
答案 3 :(得分:0)
在你的代码中,hello.py只包含一个方法,如果你把它包装在一个可以看作模块的类中。