Системные функции R всегда возвращают ошибку 127
Мне нужно запустить внешний инструмент из R
и обработать ошибки (если они есть) в этом инструменте.
Я знаю 3 функции, чтобы сделать что-то знакомое с моей задачей:
shell, system and system2.
Пытаясь проверить это, я вижу эту команду
shell("notepad")
открывает блокнот. Насколько я знаю, оболочка не позволяет проверять ошибки (нет интерфейса для просмотра stderr
).
Когда я звоню
system("notepad")
или
system2("notepad")
R
зависает при попытке выполнить эти команды.
Вызов
system("start notepad")
или
system2("start notepad")
возвращает предупреждение
Warning message:
running command '"start notepad"' had status 127
Ответы
Ответ 1
Как я уже упоминал в своих комментариях, в документации R показано, что в Windows функция system()
не запускает отдельную оболочку (если необходимо). Вот почему команды командной строки работают с system()
, но Notepad, который требует отдельного окна, не запускается:
Из документация для system()
:
Самое важное отличие состоит в том, что в Unix-подобной системе запускается оболочка, которая затем запускает команду. В Windows команда запускается напрямую - использует оболочку для интерфейса, который запускает команду через оболочку (по умолчанию оболочка Windows cmd.exe, которая имеет много отличий от оболочки POSIX).
Ответ 2
Адаптация ответа @DavidTseng (извините за отсутствие достаточной репутации для его продвижения)...
system("cmd.exe", input = "notepad")
работал у меня в Windows.
Ответ 3
system("bash -l", input = "notepad")
Ответ 4
для пользователей windows
неправильно: system(path("c:", "program files", "r", "anysoft.EXE"))
но работает: system(path("c:", shQuote("program files"), "r", "anysoft.EXE"))
Ответ 5
Я не уверен, было ли обновление для R, которое позволяет это, так как вопрос был задан почти четыре года назад, но system("\"C:\path\to\exe.exe\" args", intern = T)
работает для меня и БУДЕТ открыть отдельное дочернее окно и работает на Windows 10 + R 3.6 + RStudio,
Не использование 'intern = T' давало мне код возврата 127 и не запускало процесс.
Ответ 6
Вы, ребята, делаете это так сложно. Я решил эту проблему, сославшись на этот ответ. Проблема с ПУТИ. наберите Sys.which('')
в R, и вы ничего не увидите. Таким образом, вы должны установить путь в CMD, а затем использовать Sys.setenv(PATH = '')
в R, чтобы получить эту работу.