Запуск подпроцесса работает из Python, но не при использовании R и Reticulate.

У меня есть команда, сохраненная в текстовом файле, которую я хочу выполнить, используя subprocess.run() из R, используя пакет reticulate.

У меня есть каталог с тремя файлами:

  • test_command.txt, который содержит команду touch foo.txt

  • run_command.py:

import subprocess
import os

subprocess.check_output('bash test_command.txt')
print(os.path.isfile("foo.txt"))  # Check if the command was actually executed properly
  • run_from_r.R:
library(reticulate)
use_condaenv("my_env")  # Same conda environment as used for python
source_python("run_command.py")

Когда я запускаю run_command.py напрямую, создается foo.txt и возвращается True.

Однако, когда я запускаю из R с помощью run_from_r.R, я получаю следующее сообщение:

Error in py_run_file_impl(file, local, convert) : 
  OSError: [WinError 6] The handle is invalid

Detailed traceback: 
  File "<string>", line 5, in <module>
  File "C:\Users\Danie\miniconda3\envs\wildcats_summer_env\lib\subprocess.py", line 411, in check_output
    **kwargs).stdout
  File "C:\Users\Danie\miniconda3\envs\wildcats_summer_env\lib\subprocess.py", line 488, in run
    with Popen(*popenargs, **kwargs) as process:
  File "C:\Users\Danie\miniconda3\envs\wildcats_summer_env\lib\subprocess.py", line 753, in __init__
    errread, errwrite) = self._get_handles(stdin, stdout, stderr)
  File "C:\Users\Danie\miniconda3\envs\wildcats_summer_env\lib\subprocess.py", line 1054, in _get_handles
    p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)

system("bash test_command.txt") правильно работает в R.

Есть идеи, что означает это сообщение об ошибке и как заставить команду работать правильно при использовании subprocess.check_output/run и reticulate?

Спасибо!


person DanielWard    schedule 21.07.2020    source источник


Ответы (1)


Кажется, я исправил это, используя:

subprocess.run(['bash', 'test_command.txt'], stdout=subprocess.PIPE,
               stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL)

Из Python, работающий как служба Windows: OSError : [WinError 6] Неверный дескриптор

person DanielWard    schedule 21.07.2020