Ответ 1
type является внутренней командой, поэтому вам нужно запустить cmd.exe, например, неявно через shell=True.
Если вы передадите команду в виде списка в Windows, то subprocess.list2cmdline() вызывается для преобразования списка в строку, чтобы перейти к CreateProcess() Windows API. Его синтаксис отличается от синтаксиса cmd.exe. Для получения дополнительной информации прочитайте ссылки в этом ответе.
Передайте команду оболочки в виде строки и добавьте shell=True:
from subprocess import check_call
check_call(r'type "C:\path\with spaces & special symbols.txt"', shell=True)
Примечание: префикс r'' используется, чтобы избежать экранирования backslahes в литеральной строке.
Если команда работает так же, как из командной строки, она также должна работать и с Python.
Если имя файла указывается в переменной, вы можете избежать его для оболочки cmd с помощью ^:
escaped_filename = filename_with_possible_shell_meta_chars.replace("", "^")[:-1]
check_call('type ' + escaped_filename, shell=True)
Примечание: нет явных кавычек.
Очевидно, вы могли бы эмулировать команду type в чистом Python:
TYPE копирует консольное устройство (или в другое место) если перенаправлено). Не проверяется, что файл является читаемым текстом.
Если вам нужно только прочитать файл; используйте функцию open():
with open(r'C:\path\with spaces & special symbols.txt',
encoding=character_encoding) as file:
text = file.read()
Если вы не укажете явное кодирование, тогда open() использует кодовую страницу ANSI, например 'cp1252' (locale.getpreferredencoding(False)), чтобы декодировать содержимое файла в текст Unicode.
Примечание: здесь необходимо учитывать 4 символьных кодировки:
- символьная кодировка самого текстового файла. Это может быть любое, например,
utf-8 - Кодовая страница ANSI, используемая приложениями GUI, такими как
notepad.exeнапример,cp1252илиcp1251 - Кодовая страница OEM, используемая cmd.exe, например,
cp437илиcp866. Они могут использоваться для вывода командыtypeпри ее перенаправлении -
utf-16, используемый Unicode API, напримерWriteConsoleW(), например, когда используется переключательcmd /U. Примечание. Консоль Windows отображает UCS-2, т.е. Поддерживаются только символы Unicode BMP, но копия-паста работает даже для астральных символов, таких как 😊 (U + 1F60A).
См. Следите за кодовой страницей.
Чтобы распечатать Unicode в консоли Windows, см. Что такое сделка с Python 3.4, Unicode, разными языками и Windows?