Python-CGI环境设置


Python-CGI environment set-up?

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

  1. 接口(以 php 为单位)->
  2. [NLP Engine] (在python中) ->
  3. API 调用(以 php 为单位)->
  4. 结果(以菲律宾比索为单位)

输入应该通过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>"

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

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

该项目在GitHub上,所以如果有人想看一下,他非常欢迎!

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

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

问题是你运行了两次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

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