【问题标题】:Running R script with subprocess on Windows, subprocess seems missing在 Windows 上使用子进程运行 R 脚本,子进程似乎丢失
【发布时间】:2017-01-19 14:27:40
【问题描述】:

我在 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子进程中缺少一个文件,还是我错过了什么?

【问题讨论】:

  • 在应用程序、系统、当前和PATH目录中找不到名为“Rscript”或“Rscript.exe”的文件。
  • 所以我确实编辑了我的问题。它似乎没有找到 Rscript。我已经检查了路径,它是。此外,在 powershell 中,命令 Rscript .\sb.R 确实有效。
  • 但这并不意味着 PowerShell 会找到名为“Rscript”或“Rscript.exe”的文件。它还从PathExt 环境变量中查找名称和扩展名。运行where.exe Rscript 进行查找。
  • 另外,既然您知道 R 的安装位置,请尝试 where.exe /r [R installation path] Rscript 递归搜索其文件夹中名为 Rscript、Rscript.exe 等的文件。
  • 所以我将整个路径放在命令中,是的,它可以工作。做你所说的意味着在我运行的任何计算机上,我应该将 R 包添加到我的资源然后知道它的路径,或者首先在计算机上找到?那么这是一个有限的解决方案还是只是为了让我的代码正常工作的临时解决方案?

标签: python r windows powershell subprocess


【解决方案1】:

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

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

sb.R

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

subprocess_demo.py

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

【讨论】:

  • 错误来自 Python 内部,来自CreateProcess 调用(由subprocess.Popen 调用)无法找到 rscript.exe。它与查找“sb.R”无关。此外,相对路径是针对 rscript.exe 子进程继承的进程工作目录解析的,与 Python 脚本的目录无关。工作目录、应用程序目录(python.exe所在位置)、脚本目录相互之间没有关系。
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2023-03-07
相关资源
最近更新 更多