Интерактивный запуск нескольких системных команд Windows изнутри R - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь создать пакет R для Windows 10, который позволит мне использовать клиент протокола защищенной передачи файлов (SFTP) PuTTY, PSFTP из консоли R для передачи файлов туда и обратнона сервер SFTP (да, я понимаю, что существуют другие пакеты, которые могут выполнять передачу SFTP, но я действительно хочу разработать это для работы именно с PSFTP). Я думаю, что я смогу заставить это работать, если я смогу просто преодолеть одно препятствие, которое я не знаю, как реализовать в R. Есть ли способ, которым я могу вызвать системную команду windows и запустить ее как своего рода сеанс, чтобы я мог продолжатьработать с ним в интерактивном режиме изнутри R? По сути, я просто хочу взять команды из консоли R и передать их в то же окно командной строки Windows, в котором одна команда выполняется после предыдущих команд.

Простой пример с игрушкой поможет мне объяснить, что я пытаюсь сделать. Допустим, мне нужно построчно выполнить несколько системных команд Windows в R, например, используя cd .., чтобы изменить каталог на один уровень, а затем перечислить содержимое с помощью dir. Я мог бы попробовать это:

system("cmd.exe", input="cd ..")
system("cmd.exe", input="dir")

Очевидно, что это не сработает так, как я хочу, потому что нет «памяти» первой строки кода, выполненной в системе Windows, когда явыполнить вторую строку. Мне бы хотелось, чтобы в R был какой-то способ создания кода, подобного приведенному выше, чтобы он был эквивалентен моему запуску командной строки из одного окна cmd и вводу следующих команд по одной:

cd ..
dir

В конце я хочу создать своего рода Windows-сессию - вроде как работает пакет rvest. В rvest пользователи могут создавать сеанс, а затем последовательно отправлять команды сеансу, и каждая последующая команда начинает с того места, где остановилась последняя команда в сеансе:

library(rvest)
session <- html_session("http://hadley.nz")
jump_to(session, "hadley-wickham.jpg")  #this continues with the session via first argument

Я в основном хочу реализоватьта же концепция, что и здесь, где мои последующие строки продолжаются с предыдущих. Это возможно? Как бы я поступил так с примером "cd ..", "dir" выше? Если я смогу понять это, я думаю, что я отправлюсь на гонки.

Спасибо.

1 Ответ

1 голос
/ 01 ноября 2019

Попробуйте пакет подпроцесса следующим образом.

library(subprocess)

handle <- spawn_process("C:\\Windows\\System32\\cmd.exe")
Sys.sleep(1)

process_read(handle, PIPE_STDOUT, timeout = 1000)
process_read(handle, PIPE_STDERR)

process_write(handle, "cd ..\n")
process_write(handle, "dir\n")

process_read(handle, PIPE_STDOUT, timeout = 1000)
process_read(handle, PIPE_STDERR)

process_write(handle, 'exit\n')

Другие пакеты

Вы также можете посмотреть на пакет ps и пакет processx (который использует ps).

...