在python模块中打包支持R代码?

时间:2011-04-05 18:08:12

标签: python r packaging

我正在尝试打包一些使用rpy2调用R代码的Python代码。该R代码当前位于一个单独的文件中,我从Python脚本中source。例如,如果python脚本是myscript.py,则R代码存储在myscript_support.R中,我在myscript.py中有以下内容:

from rpy2.robjects import *

# Load the R code
r.source(os.path.join(os.path.dirname(__file__), "myscript_support.R"))

# Call the R function
r[["myscript_R_function"]]()

我现在想使用setuptools打包这个Python脚本,我有几个问题:

  1. 我应该如何打包R支持代码,一旦完成,我如何找到R文件的路径以便我可以获取它?

  2. R代码取决于几个 R 包。如何确保安装这些?如果无法加载这些R包,我是否应该提出信息错误?

3 个答案:

答案 0 :(得分:4)

这个问题可能已过时,但我今天遇到了同样的问题,希望为@ivan_pozdeev提出的问题1解决方案和问题2的新解决方案提供更多细节。

1)将您的setup.py文件编辑为:

from setuptools import setup, find_packages

setup(
    ...
    # If any package contains *.r files, include them:
    package_data={'': ['*.r', '*.R']},
    include_package_data=True)
    )

2)Conda很快成为处理python和R中的包依赖关系的一个很好的选择。你可以创建一个环境(http://conda.pydata.org/docs/using/envs),下载你可能需要的所有r和python包,然后生成一个environment.yml文件,以便任何人都可以复制您的环境。查看此博客以获取更多信息:https://www.continuum.io/content/conda-data-science

答案 1 :(得分:3)

好吧,想象一下自己是setuptools打包器,并想一想你希望程序员做些什么。

  • Setuptools对R,其文件结构或代码以某种方式使用它们一无所知。
  • 您的R解释器对从Python .egg的
  • 导入文件一无所知

对于第一个问题,您有两个选择:

  1. 告诉setuptools只包含一些额外的文件,而不用打扰它们是什么
  2. 教授关于R的setuptools,如何确定程序使用的R文件以及如何跟踪和包含它们的依赖关系
  3. 第一个选项是通过将include_package_data = True传递给setup()并提供要包含在package_datasetuptools docs, "Including Data Files" section)中的文件掩码来实现的。可以使用与包的目录相关的路径。这些文件将在运行时通过“资源管理API”("Accessing Data Files at Runtime" section)以相同的相对路径访问。

    第二个选项要求您在调用setup()之前将代码添加到setuptools。例如,您可以add a file finder将相关的.R文件添加到find_packages()的结果中。或者只是通过任意方式生成上一段的文件列表。

    对于第二个问题,最简单的方法是强制setuptools通过指定zip_safe = False将程序包安装为目录而不是.egg。 您可以使用eager_resources选项来按需提取一组资源("Automatic Resource Extraction" section)。

    至于安装第三方R软件包,R Installation and Administration - Installing packages

    描述了一种自动化技术

答案 2 :(得分:0)

  

我应该如何打包R支持   代码,一旦我这样做,怎么做   我找到了R文件的路径,所以我可以   来源吗?

对于要安装的源文件,您需要在package_data中以某种方式指定它们。你可以用与现在完全相同的方式找到他们的路径。

  

R代码取决于几个R.   包。我怎样才能确保这些   安装?我应该提出一个   如果这些R包的信息错误   无法加载?

要么setup.py检查它们是否存在(类型为“configtools方法”),或者只是在无法加载它们时引发某种异常。或者也许两者都做,然后如果由于某种原因你依赖的文件消失了,至少你会知道它。