Python-CGI环境设置?

时间:2013-10-18 18:08:41

标签: php python apache cgi development-environment

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

  1. 界面(在php中) - >
  2. [NLP引擎](在python中) - >
  3. API调用(在php中) - >
  4. 结果(在php中)
  5. 输入应该通过GET方法从PHP接口传递到Python引擎。

    背景

    我使用Easy-PHP Dev Server(url=/linguistics/)创建了一个虚拟主机(Location=D:\Computational_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>"
    

2 个答案:

答案 0 :(得分:0)

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

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

项目在GitHub,所以如果有人想看看,他是最受欢迎的!

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

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

答案 1 :(得分:0)

问题是您在发送任何标头之前运行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')

但是,在目前的形式中,它可能在浏览器中看起来很乱,因为你需要通知浏览器,charset是'utf-8',你需要更改内容类型标题:

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

P.S。希望这些仅供本地使用,不能从互联网上获取,因为这应该要复杂得多。