Вы можете позвонить им через os.system
, что работает, но ...
Экранирование: os.system
работает только с именами файлов, в которых нет пробелов или других метасимволов оболочки в имени пути (например A:\abc\def\a.txt
), иначе их нужно экранировать. Есть shlex.quote
для Unix-подобных систем, но ничего стандартного для Windows. Возможно, посмотрите также python, windows: разбор командных строк с помощью shlex
- Mac OS X:
os.system("open " + shlex.quote(filename))
- Окна:
os.system("start " + filename)
куда, собственно говоря filename
, тоже нужно убежать.
Вы также можете вызвать их через subprocess
модуль, но ...
Для Python 2.7 и новее просто используйте
subprocess.check_call(['open', filename])
В Python 3.5+ вы можете эквивалентно использовать немного более сложный, но также несколько более универсальный
subprocess.run(['open', filename], check=True)
Если вам необходимо обеспечить полную совместимость с Python 2.4, вы можете использовать subprocess.call()
и реализовать свою собственную проверку ошибок:
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
Итак, каковы преимущества использования subprocess
?
- Безопасность: Теоретически это более безопасно, но на самом деле нам нужно так или иначе выполнить командную строку; в любой среде нам нужна среда и службы для интерпретации, получения путей и т. д. Ни в том, ни в другом случае мы не выполняем произвольный текст, поэтому он не имеет присущей
'filename ; rm -rf /'
проблеме «но вы можете печатать », и если имя файла может быть повреждено, использование subprocess.call
дает нам небольшую дополнительную защиту.
- Обработка ошибок: на самом деле это не дает нам больше возможностей для обнаружения ошибок,
retcode
в любом случае мы все еще зависим от них; но поведение явного вызова исключения в случае ошибки, безусловно, поможет вам заметить сбой (хотя в некоторых сценариях обратная трассировка может оказаться не более полезной, чем простое игнорирование ошибки).
- Создает (неблокирующий) подпроцесс : нам не нужно ждать дочерний процесс, так как мы по формулировке задачи запускаем отдельный процесс.
На возражение «Но subprocess
предпочтительнее». Однако os.system()
он не является устаревшим, и в некотором смысле это самый простой инструмент для этой конкретной работы. Вывод: использование os.system()
- тоже правильный ответ.
Заметное недостатком является то , что Windows , start
команда требует , чтобы передать в shell=True
который сводит на нет большую часть преимуществ использования subprocess
.