2012-07-23 25 views
0

我是網站開發的新手,我正在嘗試創建一個簡單的mod_wsgi應用程序,它調用R腳本將一些文本寫入.txt文件,然後mod_wsgi讀取該文件並將其顯示在網頁上。當我在命令行手動執行時,python和R代碼可以工作,但是當我嘗試將它與我的web應用程序集成時,它根本不執行R腳本,因此不會爲Web應用程序生成.txt文件以供讀取。這是導致500錯誤。我的mod_wsgi網絡應用程序沒有運行其他腳本

我傳遞一些命令行參數與使用os.system()將R腳本,但就像我之前說的,是沒有得到執行將R腳本:

a=2 
b=3  
commandString = "/home/usr/bin/R --no-save --quiet --slave --args " + str(a) + " " + str(b) + " <webcalc.R" 
os.system(commandString) 
f=open('/home/usr/webapps/simple/htdocs/prob.txt','r') #This is the file that the R script was supposed to write. 
prob=f.read(2) 
prob=str(prob)+'%' 
f.close() 

我使用的是Apache服務器。這裏是確切的錯誤我從我的錯誤日誌中獲得:

[Mon Jul 23 17:45:42 2012] [error] [client 127.0.0.1] mod_wsgi (pid=10367): Exception occurred processing WSGI script '/home/usr/webapps/simple/htdocs/index.py'. 
[Mon Jul 23 17:45:42 2012] [error] [client 127.0.0.1] Traceback (most recent call last): 
[Mon Jul 23 17:45:42 2012] [error] [client 127.0.0.1] File "/home/usr/webapps/simple/htdocs/index.py", line 88, in application 
[Mon Jul 23 17:45:42 2012] [error] [client 127.0.0.1]  f=open('/home/usr/webapps/simple/htdocs/prob.txt','r') 
[Mon Jul 23 17:45:42 2012] [error] [client 127.0.0.1] IOError: [Errno 2] No such file or directory: '/home/usr/webapps/simple/htdocs/prob.txt' 
[Mon Jul 23 17:45:42 2012] [error] [client 127.0.0.1] File does not exist: /home/usr/webapps/simple/htdocs/favicon.ico 

我敢肯定,這是一個很簡單的問題,但我不能在任何地方找到一個解決方案。我非常感謝你能給我的任何幫助。

+0

它說:'沒有這樣的文件或目錄:'/ home/usr/webapps/simple/htdocs/prob.txt',那麼你確定你的R腳本正在創建該文件嗎?當你在'home/usr/webapps/simple/htdocs'目錄中查看時,它在那裏嗎? – 2012-07-23 17:55:58

+0

請勿使用os.system。 [使用'subprocess'模塊](http://docs.python.org/library/subprocess.html) – 2012-07-23 18:05:18

+0

R腳本肯定不會創建這個文件,但我幾乎肯定這是因爲R腳本沒有獲得首先運行。當我手動將我創建的「prob.txt」文件放入目錄時,mod_wsgi腳本完美地工作,並顯示我放入prob.txt文件中的任何內容。然而,問題是我希望R腳本創建.txt文件。 – vokey588 2012-07-23 18:08:05

回答

0

重要:這是無法防止惡意輸入

import subprocess 
a=2 
b=3 
commandString = "/home/usr/bin/R --no-save --quiet --slave --args " + str(a) + " " + str(b) + " < /path/to/webcalc.R" 
# This is BAD PRACTICE, but necessary in this instance, 
# if my assumptions of R are correct. 
retval = subprocess.call(commandString, shell=True) 

除非你的[R解釋(或者不管它是什麼)可以接受一個文件名,而不是直接使用輸入重定向,你必須通過一個字符串子過程.call()並使用shell = True,這是一件壞事(tm)。

您還應該按照我在示例中所做的方式,通過絕對路徑指定輸入腳本,而不是相對路徑。

+0

您的修復工作! 另外,我不明白你的意思是輸入重定向。你能否通過「......直接接受文件名而不是......輸入重定向」來解釋你的意思,以及理想的選擇是什麼?感謝你的幫助,科林。 – vokey588 2012-07-23 18:26:11

+0

@ user1385991看着[R manpage](http://linux.die.net/man/1/r),看起來你必須用'<輸入文件和'>'輸出文件。請查看[關於bash I/O重定向的此頁面](http://tldp.org/LDP/abs/html/io-redirection.html)。理想情況下,你只需給R解釋器腳本的文件名(就像你用python做的那樣)而不是重定向。通過重定向,你告訴shell執行如下操作:'cat myRscript.r |/usr/bin/R --somearg'。 – 2012-07-23 18:31:30

+0

是否可以在不使用輸入重定向的情況下提供R腳本命令行參數? – vokey588 2012-07-23 18:44:28

相關問題