Вызов RScript в подпроцесс в задании APScheduler (Python) - PullRequest
0 голосов
/ 07 сентября 2018

Я успешно использую APScheduler для планирования выполнения кода Python, и мне нужно расширить его, чтобы вызвать внешний процесс RScript (Python 3.6 в Windows 10, R 3.5.1). Моя работа - это одна строка кода, которая вызывает следующую функцию:

def execute_r_script(script_path, *args):
    result = subprocess.run(args=[_r_executable, script_path, *args], 
        stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False)
    result.check_returncode()

Если я вызываю эту функцию напрямую (т.е. не из запланированной задачи), она работает правильно. Если я вызываю его из запланированного задания, вызов подпроцесса никогда не возвращается. Я вижу, что RScript запускается, просматривая список всех запущенных процессов, и, если я вручную убью RScript, то вернется подпроцесс (не получив выходных данных и с RC равным 1).

Я пробовал и APScheduler ProcessPoolExecutor и ThreadPoolExecutor; Я даже пытался установить gevent и использовать его. Все ведут себя одинаково.

Одной из особенностей, которые мне свойственны, является то, что, если я вызываю Rscript с опцией --help описанным выше способом - вместо имени файла сценария - он возвращается просто отлично, даже как запланированное задание. Это предполагает, что это что-то в конкретном скрипте, который я запускаю, но

  • работает нормально с моим сценарием, когда подпроцесс вызывается напрямую, а не в запланированном задании
  • запуск скрипта с Rscript в командной строке работает как положено
  • Я попробовал скрипт, который просто печатает одну строку текста, и скрипт, который пуст.

Я действительно в тупике. Я попытался передать ерунду в качестве имени скрипта, и она сразу же возвращается с ошибкой, так что не думайте, что проблема в том, что R находит скрипт. Я не могу понять, что может отличаться от среды выполнения как от задания, которое может привести к зависанию RScript, тем более что он зависает только при запуске сценария, который в противном случае работает нормально в подпроцесс .

Примите во внимание любые указания или устранение неполадок, которые я должен попытаться предпринять.

...