0

我有一个非常奇怪的问题。当我从 linux 命令行运行此脚本时python scriptname.py,一切正常。当我通过浏览器请求它时,它给了我内部错误 500

我正在导入一个脚本 trainstate.py,它与我正在运行的脚本位于同一目录中。我还在目录中放置了一个__init__.py777权限的空文件

注意任何执行标准导入的脚本(例如import os)都可以通过浏览器正常工作

from trainstate import *

print "Content-Type: text/html\n\n"

st = TrainState(784)
print st.get_state()

我究竟做错了什么?

4

2 回答 2

1

我正在导入一个脚本 trainstate.py,它与我正在运行的脚本位于同一目录中

这并不意味着该目录是您的网络服务器进程的当前工作目录,而不是它位于该进程的 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()
于 2013-04-29T18:32:31.720 回答
1

在您的补充意见之后,我想详细说明。

您可能正在使用一些不是 python 参考 cgi/http/wsgi 实现的 cgi 后端。相反,该后端(无论是 apache、iis 还是其他)可能会嵌入一个 python 解释器来运行你的 python cgi 脚本。

我在此设置中遇到的最常见问题之一是处理导入路径。考虑以下场景:

  1. 我在同一目录中有 foo.py 和 bar.py 。
  2. foo.py 是 cgi 入口点。
  3. foo.py 导入 bar.py——import bar做某事。
  4. 不知何故导入失败。
  5. 这非常令人沮丧,因为我们别无选择,只能盯着丑陋的粗体500消息。

这是因为 foo.py 的目录不包含在 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.

于 2013-04-29T19:15:40.917 回答