在Windows上使用子进程运行R脚本,似乎缺少子进程

时间:2016-09-12 07:38:03

标签: python r windows powershell subprocess

我在windows上使用python。 我想在我的python代码中调用R脚本。

我的脚本R是:

c <- 3
print(paste("hello", c))

我的python代码像这样调用Rscript:

import subprocess
subprocess.call(['Rscript', "sb.R"])

不幸的是我有这条错误消息:

File "C:\Users\[...]\Local\Programs\Python\Python35-32\lib\subproce
ss.py", line 557, in call
    with Popen(*popenargs, **kwargs) as p:
  File "C:\Users\[...]\Local\Programs\Python\Python35-32\lib\subproce
ss.py", line 947, in __init__
    restore_signals, start_new_session)
  File "C:\Users\[...]\Local\Programs\Python\Python35-32\lib\subproce
ss.py", line 1224, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] The file is not found

我检查过以下内容:

1)在powershell下,当我输入Rscript .\sb.R时,它可以工作。

2)在我试过的python代码中

theproc = subprocess.Popen([sys.executable, "sbpy.py"])
theproc.communicate()

其中sbpy.py包含print("hello py")。这也有效。所以我假设库子进程可以工作。

3)我尝试了以下代码:

cmd = ['Rscript', 'sb.R']
x = subprocess.check_output(cmd, shell=True)

我有以下错误:

...
  File "C:\Users\[...]\Local\Programs\Python\Python35-32\lib\subproce
ss.py", line 708, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['Rscript', 'sb.R']' returned non-zero e
xit status 1

4)至于路径,我已经检查过,是的R文件夹在我的路径中。

我在我的Windows机器上新安装了python35,它是lib子进程中缺少的文件,还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

检查你的python脚本和Rscript是否是相同的文件位置。

实施例:        在桌面位置下创建名为sb.R和subprocess_demo.py的文件。        在命令提示符下将目录更改为Desktop并运行以下命令         python subprocess_demo.py

<强> sb.R

from StringIO import StringIO
from zipfile import ZipFile
from urllib import urlopen

url = urlopen("https://archive.ics.uci.edu/ml/machine-learning-databases/00320/student.zip")

z = ZipFile(StringIO(url.read()))

for line in z.open("student-por.csv").readlines():
     print line

<强> subprocess_demo.py

class MyComponent extends Component {
    state = {};
    componentDidMount(){
         BackHandler.addEventListener('hardwareBackPress', this.backHandler);
    }
    componentWillUnmount(){
         BackHandler.removeEventListener('hardwareBackPress', this.backHandler);
    }
    backHandler = () => {
        if(this.state.backButtonEnabled) {
            this.refs[WEBVIEW_REF].goBack();
            return true;
        }
    }
}