【问题标题】:Python-CGI environment set-up?Python-CGI 环境设置?
【发布时间】:2013-10-18 18:08:40
【问题描述】:

我正在使用 python 中的nltk 做一个自然语言处理项目。 项目块结构如下:

  1. 接口(在 php 中)->
  2. [NLP 引擎](在 python 中)->
  3. API 调用(在 php 中)->
  4. 结果(在 php 中)

输入应该通过 GET 方法从 PHP 接口传递到 Python 引擎。

背景:

我使用 Easy-PHP 开发服务器 (Location=D:\Computational_Linguistics) 创建了一个虚拟主机 (url=/linguistics/) 服务器。我已启用它,以便它可以执行Test.py,这样当我输入linguistics/Test.py 时,它就会执行。

问题:

基本的 CGI 已成功执行,我可以在 Chrome 中看到输出。但是当我导入另一个模块时,它返回了这个错误:

服务器错误!

服务器遇到内部错误,无法完成您的请求。

错误信息: 头文件前的脚本输出结束:engine.py

如果您认为这是服务器错误,请联系网站管理员。

错误 500

语言学 Apache/2.4.4 (Win32) PHP/5.5.0

当我不导入 nltk(或任何其他非标准包)时,它可以工作。

我确实进行了网络搜索以找到解决方案,并且知道我必须设置一些环境变量才能使其正常工作。 但是,我不知道怎么做。

我的代码:

#!C:/Python27/python.exe
import nltk
from nltk import *
import re
import cgi, cgitb

inpt=cgi.FieldStorage() 
str_in = inpt.getvalue('query')

def is_noun (str):
    tags=nltk.pos_tag(nltk.word_tokenize(str))
    for i in tags:
        if i[1][1]=='N' or i[1][1]=='V':                            #Finding out the Nouns and the Verbs.
            print "<h5>%s is a noun.<h5>" %i[0]

is_noun(str_in)

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
is_noun(str_in)
print "</body>"
print "</html>"

【问题讨论】:

    标签: php python apache cgi development-environment


    【解决方案1】:

    由于我没有收到任何答案(不怪任何人!),我阅读了更多文档。正如我在上面的问题陈述中所描述的,只有 NLP 引擎是用 Python 编写的。而且,该问题仅存在于 CGI 环境中。 因此我的解决方案:

    我修改了 engine.py 以接收输入作为命令行参数,然后对其进行处理。它将处理后的数据(以精确格式)返回到缓冲流。 我在 PHP 中使用了 exec() 命令来执行此操作。

    项目在GitHub,如果有人想看,欢迎!

    PS:我仍然不知道该错误的原因。我很确定所有环境路径都是正确的。因此,我将此答案称为变通方法,而不是解决方案。

    PPS:我正在回答我自己的问题,所以如果有人有同样的问题,他们可能会考虑这个解决方法。

    【讨论】:

      【解决方案2】:

      问题是您运行了两次is_noun,第一次是在您发送任何标头之前。因此,错误。

      另一个问题是str_instr,但我认为nltk.pos_tag 期望unicode。也就是说,您需要解码str_in 值(如果您使用纯 ASCII 之外的任何符号。无论如何您都应该这样做,但只有在输入中有这样的字符时您才会注意到):

      str_in = unicode(inpt.getfirst('query', ''), 'utf-8')
      

      然后,当您打印 unicode 时,您需要将其编码回来:

      print "<h5>%s is a noun.<h5>" % i[0].encode('utf-8')
      

      但是,在当前的形式下,它在浏览器中可能看起来是乱码,因为您需要通知浏览器,字符集是 'utf-8',即您需要更改内容类型标头:

      print "Content-Type: text/html; charset=utf-8"
      print
      

      附:希望这一切都仅供本地使用,不能从互联网上获得,因为这应该要复杂得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 2019-07-31
        • 2015-08-09
        • 2021-04-02
        • 2018-11-28
        相关资源
        最近更新 更多