Мне понравилось решение 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))
}
}
}
В вашем коде нет ничего плохого, проблема в том, что команда, которую вы запускаете, пытается что-то сделать с текущим терминалом и неправильно восстанавливает настройки, при которых происходит отключение. Замена вашей команды на «сон», как показано ниже, будет работать нормально и без проблем остановится на 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)