Python - 从其他脚本导入代码时出现错误500

时间:2013-04-29 15:55:23

标签: python python-import

我有一个非常奇怪的问题。 当我从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()

我做错了什么?

2 个答案:

答案 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脚本。

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

  1. 我在同一目录中有foo.py和bar.py。
  2. foo.py是cgi入口点。
  3. foo.py导入bar.py - import bar做某事。
  4. 以某种方式导入失败。
  5. 这是非常令人沮丧的,因为我们别无选择,只能盯着丑陋的 500 消息。
  6. 这是因为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中添加该文件夹的路径。