subprocess.Popen вызывает сбой терминала после KeyboardInterrupt

Мне понравилось решение steamer25, поскольку оно кажется самым надежным для моих целей. Однако при отладке в RStudio (в окнах) путь не будет установлен правильно. Причина заключается в том, что если в RStudio установлена ​​точка останова, в поиске файла используется альтернативная команда «отладочный источник», которая устанавливает путь к сценарию несколько иначе. Вот окончательная версия, которую я сейчас использую, которая учитывает это альтернативное поведение в RStudio при отладке:

# @return full path to this script
get_script_path <- function() {
    cmdArgs = commandArgs(trailingOnly = FALSE)
    needle = "--file="
    match = grep(needle, cmdArgs)
    if (length(match) > 0) {
        # Rscript
        return(normalizePath(sub(needle, "", cmdArgs[match])))
    } else {
        ls_vars = ls(sys.frames()[[1]])
        if ("fileName" %in% ls_vars) {
            # Source'd via RStudio
            return(normalizePath(sys.frames()[[1]]$fileName)) 
        } else {
            # Source'd via R console
            return(normalizePath(sys.frames()[[1]]$ofile))
        }
    }
}
0
задан alexlipa 18 January 2019 в 13:52
поделиться

1 ответ

В вашем коде нет ничего плохого, проблема в том, что команда, которую вы запускаете, пытается что-то сделать с текущим терминалом и неправильно восстанавливает настройки, при которых происходит отключение. Замена вашей команды на «сон», как показано ниже, будет работать нормально и без проблем остановится на Ctrl + C:

import subprocess

command = ['/bin/bash']
command.extend(['-c', 'sleep 600'])

p = subprocess.Popen(command)

try:
  p.communicate()
except KeyboardInterrupt:
  p.terminate()

Я не знаю, что вы пытаетесь сделать с помощью spark-shell, но если вам не нужен его вывод, вы можете попробовать перенаправить его в / dev / null, чтобы он не испортил дисплей терминала:

p = subprocess.Popen(command, stdout=subprocess.DEVNULL)
0
ответ дан piwai 18 January 2019 в 13:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: