Я успешно использую 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, тем более что он зависает только при запуске сценария, который в противном случае работает нормально в подпроцесс .
Примите во внимание любые указания или устранение неполадок, которые я должен попытаться предпринять.