我有一个非常奇怪的问题。
当我从linux命令行python scriptname.py
运行此脚本时,一切正常。当我通过浏览器请求它时,它给我内部错误500
我正在导入一个脚本trainstate.py,它位于我正在运行的脚本的同一目录中。我还在目录
中放置了一个空文件__init__.py
,其中包含777个权限
N.B。任何执行标准导入的脚本(例如import os
)都可以通过浏览器正常工作
from trainstate import *
print "Content-Type: text/html\n\n"
st = TrainState(784)
print st.get_state()
我做错了什么?
答案 0 :(得分:1)
我正在导入一个脚本trainstate.py,该脚本位于我正在运行的脚本的同一目录中
这并不意味着此目录是您的Web服务器进程的当前工作目录,而不是它在此进程的sys.path中。 thkang已经提供了最好的答案(按照相反的顺序,我应该说),但无论如何 - 尝试使用此代码,看看你得到了什么:
import sys, os
print "Content-Type: text/html\n\n"
print "sys.path is : ", ", ".join(sys.path)
print "current working directory is : ", os.getcwd()
try:
# star imports are evil
from trainstate import TrainState
except Exception, e:
print "failed to import TrainState : %s" % e
else:
st = TrainState(784)
print st.get_state()
答案 1 :(得分:1)
在你的其他评论之后,我想详细说明。
你可能正在使用一些不是python的引用cgi / http / wsgi实现的cgi后端。相反,那个后端(无论是apache,iis,无论如何)都可以嵌入一个python解释器来运行你的python cgi脚本。
我在此设置中遇到的最常见问题之一是处理导入路径。考虑以下场景:
import bar
做某事。这是因为foo.py的directroy不包含在pythonpath中,这与从命令行运行foo.py不同。要解决此问题,您可以将其路径添加到sys.path
。
所以,解决方案是:
import os
import sys
current_path = os.path.dirname(__file__)
sys.path.insert(0, current_path)
... rest of the script
好吧,如果您在某个单独的文件夹中有trainstate.py,则必须在sys.path
中添加该文件夹的路径。