我正在尝试打包一些使用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脚本,我有几个问题:
我应该如何打包R支持代码,一旦完成,我如何找到R文件的路径以便我可以获取它?
R代码取决于几个 R 包。如何确保安装这些?如果无法加载这些R包,我是否应该提出信息错误?
答案 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打包器,并想一想你希望程序员做些什么。
对于第一个问题,您有两个选择:
第一个选项是通过将include_package_data = True
传递给setup()
并提供要包含在package_data
(setuptools 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方法”),或者只是在无法加载它们时引发某种异常。或者也许两者都做,然后如果由于某种原因你依赖的文件消失了,至少你会知道它。