我正在django中构建一个与R编写的大型程序接口的网站,我希望在网站上有一个运行R程序的按钮。我使用subprocess.call()
工作,但是,正如预期的那样,服务器在subprocess.call()
返回之前不会继续呈现视图。由于这个程序可能需要几个小时才能运行,这不是一个真正的选择
有没有办法运行R程序并继续执行python代码?
我四处搜寻,并查看了subprocess.Popen()
,但我无法让它发挥作用
这是我在视图中使用的通用代码:
if 'button' in request.POST:
subprocess.call('R CMD BATCH /path/to/script.R', shell=True)
return HttpResponseRedirect('')
希望我只是忽略了一些简单的事情 谢谢。
答案 0 :(得分:6)
subprocess.Popen(['R', 'CMD', 'BATCH', '/path/to/script.R'])
该过程将以异步方式启动。
示例:
$ cat 1.py
import time
import subprocess
print time.time()
subprocess.Popen(['sleep', '1000'])
print time.time()
$ python 1.py
1340698384.08
1340698384.08
您必须注意,即使主进程停止,子进程也会运行。
答案 1 :(得分:0)
您可以使用subprocess.call()的包装器,该包装器将拥有自己的线程,在该线程中它将调用subprocess.call()方法。