os.startfile()
, как упомянуто Брэдли (+1), но обязательно передайте строку Юникода, а не строку байта.
Имена файлов Windows NT изначально являются Unicode, а Python в Windows имеет (в отличие от большинства других языков сценариев) специальную поддержку, встроенную для передачи строк Unicode в API, которые ожидают имена файлов:
os.startfile(u'Hello \u05e2\u05d5\u05dc\u05dd.xls') # u'Hello עולם.xls'
Если вы передадите байтовую строку, она перейдет в стандартную библиотеку C stdio
, которая в Microsoft C Runtime отобразит байтовые строки в имена файлов Unicode, используя набор символов по умолчанию на машине (кодовая страница ANSI), это то, что getfilesystemencoding()
возвращается. Это все равно будет работать, если каждый символ в имени файла будет представлен в кодовой странице ANSI, но пример имени файла не будет работать ни для чего, кроме установки Windows на иврите.
К сожалению, та же поддержка Unicode недоступна для system()
или subprocess
. Но вам, вероятно, не нужно использовать командную строку в этом случае.