Упаковка, поддерживающая R-код в модуле python?
Я пытаюсь упаковать часть моего кода на Python, который вызывает R-код, используя rpy2. Этот R-код в настоящее время находится в отдельном файле, который я source
из Python script. Например, если python script равен 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"]]()
Теперь я хочу упаковать этот Python script с помощью setuptools, и у меня есть несколько вопросов:
-
Как мне упаковать код поддержки R, и как только я это сделал, как мне найти путь к файлу R, чтобы я мог его исправить?
-
Код R зависит от нескольких пакетов R. Как я могу убедиться, что они установлены? Должен ли я просто повысить информативную ошибку, если эти R-пакеты не могут быть загружены?
Ответы
Ответ 1
Этот вопрос может быть устаревшим, но сегодня я столкнулся с тем же вопросом и хотел бы предоставить более подробную информацию для решения вопроса 1, предложенного @ivan_pozdeev, и нового решения для вопроса 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
Ответ 2
Хорошо, представьте себя как упаковщик setuptools и подумайте о том, чего вы ожидаете от программиста.
- Setuptools ничего не знает о структуре R, ее файлах или о том, что ваш код каким-то образом их использует.
- Ваш интерпретатор R ничего не знает об импорте файлов из Python.egg
Для первой проблемы у вас есть два варианта:
- Сообщите setuptools, чтобы просто добавить некоторые дополнительные файлы, не беспокоя их.
- Научитесь setuptools о R, как определить, какие файлы R использует ваша программа и как отслеживать и включать их зависимости.
Первый вариант реализуется путем передачи include_package_data = True
в setup()
и предоставления масок файлов для включения в package_data
(setuptools docs, "Включая данные Файлы" ). Можно использовать пути относительно каталогов пакетов. Файлы будут доступны во время выполнения на тех же относительных путях через "API управления ресурсами" ( "Доступ к файлам данных в Runtime" ).
Второй вариант потребует, чтобы вы добавили свой код в setuptools перед вызовом setup()
. Например, вы можете добавить поиск файлов, чтобы добавить соответствующие .R файлы к результатам find_packages()
. Или просто сгенерируйте список файлов для предыдущего абзаца произвольными способами.
Для второй проблемы проще всего заставить setuptools установить пакет как каталог, а не .egg, указав zip_safe = False
.
Вместо этого вы можете использовать опцию eager_resources
, которая извлекает группу ресурсов по запросу (Автоматическое извлечение ресурсов).
Как для установки сторонних пакетов R, автоматизированная техника описана в R Установка и администрирование - установка пакетов
Ответ 3
Как мне упаковать поддержку R кода, и как только я это сделал, как сделать Я нахожу путь к файлу R, чтобы я мог исправить его?
Для исходных файлов, которые нужно установить, вам нужно указать их каким-то образом в package_data
. Вы можете найти их путь точно так же, как и сейчас.
Код R зависит от нескольких R пакеты. Как я могу обеспечить, чтобы эти установлены? Должен ли я просто поднять информативная ошибка, если эти пакеты R не могут быть загружены?
Либо make setup.py
проверьте, существуют ли они (вид "подход configtools" ), либо просто поднимите какое-то исключение, если вы не можете загрузить их. Или, возможно, оба они, а потом, если по какой-то причине файлы, от которых вы зависите, исчезнут, по крайней мере, вы это узнаете.