Angular: правильный способ распространения исключения в распознавателе маршрутов на собственный обработчик глобальных ошибок

В Mac OS вы можете использовать команду «open». Существует вызов Windows API, который делает что-то подобное, но я не помню его вслух.

Update

Хорошо, команда «start» сделает это, так что это должно работать

Mac OS / X:

os.system("open "+filename)

Windows:

os.system("start "+filename)

Многое позднее обновление Edward: os.system работает, но он работает только с именами файлов, которые не имеют пробелов в папках и файлах в имени файла (например, A: \ abc \ def \ a.txt) .

Позднее обновление

Хорошо, ясно, что это глупое споры продолжаются, поэтому давайте просто посмотрим на это с помощью подпроцесса.

open и start являются средствами интерпретатора команд для Mac OS / X и Windows соответственно. Теперь предположим, что мы используем подпроцесс. Канонически вы бы использовали:

try:
    retcode = subprocess.call("open " + filename, shell=True)
    if retcode < 0:
        print >>sys.stderr, "Child was terminated by signal", -retcode
    else:
        print >>sys.stderr, "Child returned", retcode
except OSError, e:
    print >>sys.stderr, "Execution failed:", e

. Каковы преимущества этого? Теоретически это более безопасно - но на самом деле нам нужно выполнить командную строку так или иначе; в любой среде нам нужна среда и службы для интерпретации, получения путей и т. д. В любом случае мы не выполняем произвольный текст, поэтому он не имеет встроенного «но вы можете набрать 'filename ; rm -rf /'», и если имя файла может быть повреждено, использование subprocess.call не дает нам никакой защиты.

Это фактически не дает нам больше обнаружения ошибок, мы все еще в зависимости от retcode в любом случае. Нам не нужно ждать дочернего процесса, так как мы имеем дело с выражением проблемы, начиная отдельный процесс.

«Но subprocess является предпочтительным». Однако os.system() не является устаревшим, и это самый простой инструмент для этой конкретной работы.

Заключение: использование os.system() - это самый простой и простой способ сделать это, и, следовательно, правильный ответ.

1
задан Adam 11 February 2019 в 11:17
поделиться