Подтвердить что ты не робот

Упаковка, поддерживающая 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-пакеты не могут быть загружены?

4b9b3361

Ответ 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" ), либо просто поднимите какое-то исключение, если вы не можете загрузить их. Или, возможно, оба они, а потом, если по какой-то причине файлы, от которых вы зависите, исчезнут, по крайней мере, вы это узнаете.