JavaWeb笔记 (4)—— 在Tomcat中运行Python文件

Tomcat中运行Python文件

分清两个tomcat环境

在网上查了很久,大多用的是CGI。tomcat默认是关闭CGI的,要开启CGI需要在conf/web.xml文件中将被注释的几行CGI配置解除注释,

<servlet>
        <servlet-name>cgi</servlet-name>
        <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
         <init-param>
		 <param-name>debug</param-name>
		 <param-value>0</param-value>
		 </init-param>
        <init-param>
          <param-name>cgiPathPrefix</param-name>
          <param-value>WEB-INF/cgi</param-value>
        </init-param>
       <init-param>
          <param-name>executable</param-name>
          <param-value>C:\ProgramData\Anaconda3\python.exe</param-value>
        </init-param>
        <load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>cgi</servlet-name>
        <url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>

然后在conf/context.xml中在标签中加入privileged="true",也就是

<Context privileged="true"  reloadable="true">

    xxxx
</Context>

配置完毕后在eclipse中重启tomcat,访问http://localhost:8080/YOUR_PROJECT_NAME/cgi-bin/test.py,404.
但是在直接在cmd中启动tomcat,并且在tomcat的webapps/myapp/WEB-INF/cgi/中放入test.py,
访问http://localhost:8080/myapp/cgi-bin/test.py没有报404,但是consle显示python程序运行不成功
这说明在eclipse运行的tomcat和直接在tomcat根目录下运行的tomcat是不共享conf/web.xml和conf/context.xml的配置的。
eclipse运行的tomcat上只能运行eclipse内的web项目。

python运行问题

tomcat根目录下启动服务,然后又遇到了问题。访问http://localhost:8080/YOUR_PROJECT_NAME/cgi-bin/test.py步会404,但是也没有任何输出,在tomcat的consle中报错:Failed to import the site module
也就是python程序刚初始化就失败了。查了很久资料,检查了很多遍环境变量,还是不行。第二天突然起来cgi还有一个参数没有配置。
在上面的代码中加入

 <init-param>  
          <param-name>passShellEnvironment</param-name>  
          <param-value>true</param-value>  
        </init-param>

这个参数的意思是:passShellEnvironment 是否应将 Tomcat 过程的 shell 环境变量(如果存在)传入 CGI 脚本?默认为 false
将这个参数设为true后python程序就可以正常运行了,浏览器中显示"hello,world"。

python程序中module调用问题

然后我把更复杂的一些python程序放到了cgi文件夹下,有些调用numpy包,matplotlib包,都没问题,
只是没有重写程序将的话,输出图像只会在本机(也就是服务端)显示弹窗显示,输出的数据在tomcat的consle中显示,都没有输出到网页。
这个问题不大,主要是后面我运行了一个调用tushare(一个能方便获取详细股票数据的包)的程序,tomcat报错:

AttributeError: module 'tushare' has no attribute 'get_hist_data

难道是我包没安装?但是在IDE里运行很正常。以防万一我还是pip install 了一次,还是不行。也不是什么有一个重名的tushare.py导致调用失败。
我搞不懂了,我只能推测,可能是tushare的一些函数需要使用网络接口,而在tomcat的环境下网络接口是被严格控制的,python程序未经许可去远程访问,就会报错,

莫名其妙,肯定又要改什么参数,烦!————————————— 于是我放弃了,我放弃用cgi来运行python。

我只是想用python处理下数据然后获得结果,写一个API然后用JS调用不就好了,而且,cgi这东西好像已经被淘汰了,现在没几个公司还在用这个。
但还是记录一下我在cgi的努力过程,毕竟花了我一个晚上还有今天下午一个小时≡(▔﹏▔)≡ 要懂得变通嘛,不能钻牛角尖。

posted @ 2020-04-30 19:50  Raybu  阅读(2333)  评论(0编辑  收藏  举报