【问题标题】:python import rpy2.robjects does not work when called from apache web request从 apache Web 请求调用时,python import rpy2.robjects 不起作用
【发布时间】:2017-08-10 08:14:02
【问题描述】:

问题:

我的"C:\Apache24\htdocs\Test\cgi-bin" 文件夹中有一个非常简单的python 脚本(Test.py),其中包含以下代码:

#!/Python/python
print("Content-type: text/html")
print()
import os
os.environ['R_HOME'] = 'C:\Program Files\R\R-3.4.1'
os.environ['R_USER'] = 'C:\Python\Lib\site-packages\rpy2'

# importing rpy2
import rpy2.robjects as robjects

# test : evaluating R code
robjects.r('''
        # create a function `f`
        f <- function(r, verbose=FALSE) {
            if (verbose) {
                cat("I am calling f().\n")
            }
            2 * pi * r
        }
        ''')

r_f = robjects.r['f']
res = r_f(3)
print(res[0])

现在在 python shell 中执行它时它工作得很好。但是,从 Web 请求(甚至是 localhost)调用脚本只会无限期地加载页面。

附加信息:

我正在通过 RemoteDesktopConnection 开发 Windows Server 2008 R2 x64 操作系统


我的安装如下:
Python 3.6: "C:\Python" + rpy2 version: 2.8.6

R 3.4.1: "C:\Program Files\R\R-3.4.1"

Apache: "C:\Apache24"


我根据this post 设置的import osos.environ['... 命令,因为我无法使用全局系统变量进行设置。

但是我设置了环境变量(我可以在 cmd.exe 中启动 R),但是如果没有上述命令,我的 rpy2 将无法工作(即使在 python shell 中)。


我的系统变量是:
Path: "...;C:\Python\Scripts\;C:\Python\;C:\Program Files\R\R-3.4.1\bin\x64"

R_HOME: "C:\Program Files\R\R-3.4.1"

R_USER: "C:\Python\Lib\site-packages\rpy2"

我知道我的 apache 服务器可以将 python 脚本作为 cgi 执行(我还有其他可以通过 web 请求执行的 python 脚本)。实际上只是 import rpy2.robjects 命令造成了麻烦


我在寻找解决方案时找到了this post,但我对服务器配置不太了解,如果没有更详细的解释,我将无法做某事。
让我知道我是否可以提供更多详细信息。

任何帮助将不胜感激!

【问题讨论】:

标签: python r rpy2


【解决方案1】:

显然这是发生的最明显/最愚蠢的事情。在我的 python 脚本中,使用正斜杠而不是反斜杠确实解决了我的问题。所以我更新后的代码如下:

#!/Python/python
print("Content-type: text/html")
print()
import os
os.environ['PYTHONHOME'] = 'C:/Python'
os.environ['PYTHONPATH'] = 'C:/Python/lib/site-packages'
os.environ['R_HOME'] = 'C:/Program Files/R/R-3.4.1'
os.environ['R_USER'] = 'C:/Python/Lib/site-packages/rpy2'

# importing rpy2
import rpy2.robjects as robjects

# test : evaluating R code
robjects.r('''
        # create a function `f`
        f <- function(r, verbose=FALSE) {
            if (verbose) {
                cat("I am calling f().\n")
            }
            2 * pi * r
        }
        ''')

r_f = robjects.r['f']
res = r_f(3)
print(res[0])

当通过网络请求调用该脚本时,该脚本会按照应有的方式执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 2021-09-05
    • 2017-09-03
    • 2016-08-22
    • 2012-07-04
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多