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中在
<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的努力過程,畢竟花了我一個晚上還有今天下午一個小時≡(▔﹏▔)≡ 要懂得變通嘛,不能鑽牛角尖。