2012-07-23 46 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

相关问题