Вызов других скриптов в пакете PyPI - PullRequest
1 голос
/ 21 января 2020

У меня есть пакет Python, который я загрузил в PyPP. Сценарий вызывает два дополнительных R-сценария для запуска. Я проверил, что необходимые скрипты R также загружены в PyPI (физически загрузив последнюю версию и увидев их в каталоге). Я также могу успешно установить и запустить основной сценарий python.

Однако у меня возникают проблемы с выяснением того, как вызывать сценарии R из сценария Python. То есть, какую структуру каталогов я использую? Вот команда, которую я использую для запуска:

$ python_script -f file1.txt -g file2.txt

, и я получаю эту ошибку:

Неустранимая ошибка: невозможно открыть файл 'script.r': такого файла или каталога нет

В скрипте Python вот как я вызываю скрипт R:

cmd = [ 'Rscript', 'python_script/Rscript.r' ]
    output = subprocess.Popen(cmd, stderr=subprocess.PIPE).communicate()
    result = output[1].decode('utf-8')

Но ничего, что я пробую, не работает: я пробовал просто 'Rscript.r 'and' ./Rscript.r'

Я не знаю, как правильно вызвать этот скрипт. Он находится в том же каталоге, что и основной python_script, который я запускаю.

1 Ответ

1 голос
/ 21 января 2020

Путь здесь будет относительно того, откуда вы вызываете python_script, но ваши R-скрипты существуют в каталоге относительно того, где был установлен ваш пакет.

Вы можете использовать __file__ для определить полный путь к файлу, который выполняется. Разделив это, вы можете получить путь к каталогу, в который был установлен пакет, а затем добавить любые дополнительные каталоги / имена файлов, чтобы получить полный путь к вашему R-сценарию:

import os
this_dir, this_filename = os.path.split(__file__)
RSCRIPT_PATH = os.path.join(this_dir, "Rscript.r")
cmd = ['Rscript', RSCRIPT_PATH]
output = subprocess.Popen(cmd, stderr=subprocess.PIPE).communicate()
result = output[1].decode('utf-8')

Примечание: Для обеспечения кросс-платформенной совместимости здесь рекомендуется использовать os.path.join('path', 'to', 'file.txt') для генерации пути вместо path/to/file.txt, поскольку не все платформы используют / в качестве разделителя пути.

...