import feedparser' 在SSH中工作,但在浏览器中失败
我通过SSH安装了feedparser,使用的是
$ python setup.py install --home=~/httpdocs/python-libraries/feedparser-4.1/
我这么做是因为我好像没有权限正确运行'python setup.py install'。
我在'test.py'里运行以下Python代码。
print "Content-type: text/html\n\n"
try:
import feedparser
except:
print "Cannot import feedparser.\n"
当我通过SSH登录时,代码运行得很好。但是当我在浏览器中查看时,它显示
无法导入feedparser。
有什么想法吗?
4 个回答
听起来像是PYTHONPATH的问题。试着把代码改成这样,看看会发生什么:
import sys
print "Content-type: text/html\n\n"
try:
print sys.path
import feedparser
except:
print "Cannot import feedparser.\n"
print sys.path
这可能会显示你的 ~/httpdocs/python-libraries/ 目录不在路径里,你需要更改 sys.path 或者设置一个 PYTHONPATH 环境变量,来解决这个问题。
当你更改路径时,确保使用完整的目录名称,而不是 ~ 这个快捷方式。
可能是因为在从命令行运行和从网页服务器运行时,设置正确的 sys.path
出现了问题。
关于 sys.path
的更多信息可以查看这里: sys模块.
我建议在导入之前,尝试将 ~/httpdocs/python-libraries/feedparser-4.1/
(最好使用完整路径,不要带 ~/
)添加到你的 sys.path 中。
import sys
sys.path.append('/home/user/httpdocs/python-libraries/feedparser-4.1/')
print "Content-type: text/html\n\n"
try:
import feedparser
except:
print "Cannot import feedparser.\n"
哦,对了,httpdocs
看起来像是你网页服务器的文档根目录。把库放在那里是个好主意吗?(当然,除非那是你唯一能用的地方…)
编辑(作为一般说明)
最好避免使用这样的语法:
try:
something
except:
print "error"
这样做完全无法提供你遇到的实际错误信息。你可以假设如果你尝试导入一个模块,你会遇到 ImportError
,但不能确定。
这让调试变得非常麻烦。我经历过,浪费了好几个小时就是因为这个 :)
尽量每次捕获一种异常类型。所以:
try:
import SomeModule
except ImportError:
print "SomeModule can't be imported"
你还可以熟悉一下 traceback 模块。它在标准库中,可以随时使用。所以,你的异常处理代码可以像这样:
sys.path.append('/home/user/httpdocs/python-libraries/feedparser-4.1/')
try:
import feedparser
except ImportError:
print "Content-type: text/plain\n\n" # text/plain so we get the stacktrace printed well
import traceback
import sys
traceback.print_exc(sys.stdout) # default is sys.stderr, which is error log in case of web server running your script, we want it on standart output
sys.exit(1)
# here goes your code to execute when all is ok, including:
print "Content-type: text/html\n\n"
我试过用 sys.path
和 $PYTHONPATH
这两种方法,但好像都没用。
我没有尝试把 PythonPath 加到 httpd.conf
或 python.conf
里——这样做可能有效。
最后,我请了一个管理员用户帮我运行 # python setup.py install
。这样就成功了。
我当时用的是 Python 2.3。