import feedparser' 在SSH中工作,但在浏览器中失败

1 投票
4 回答
596 浏览
提问于 2025-04-15 16:08

我通过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 个回答

3

听起来像是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 环境变量,来解决这个问题。

当你更改路径时,确保使用完整的目录名称,而不是 ~ 这个快捷方式。

7

可能是因为在从命令行运行和从网页服务器运行时,设置正确的 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"
0

我试过用 sys.path$PYTHONPATH 这两种方法,但好像都没用。 我没有尝试把 PythonPath 加到 httpd.confpython.conf 里——这样做可能有效。

最后,我请了一个管理员用户帮我运行 # python setup.py install。这样就成功了。

我当时用的是 Python 2.3。

撰写回答