Избежание оболочки = Правда в Попене

Я пытаюсь открыть .txt файл в винде. Код выглядит следующим образом:

subprocess.Popen("C:\folder\file.txt", shell=True)

Это прекрасно работает. Редактор по умолчанию открывается автоматически, и файл загружается, однако я где-то читал, что вызовы через оболочку (cmd.exe в Windows) менее безопасны. Как я могу сделать то же самое без этого. Просто настройка shell=False дает мне ошибку:

OSError: [WinError 193] %1 is not a valid Win32 application

Теперь я могу попробовать это в качестве обходного пути:

subprocess.Popen("notepad C:\folder\file.txt")

но это работает, только если блокнот доступен, следовательно, теряет свою общность.

2 ответа

Решение

Если вы используете Windows, то есть (не переносимый) os.startfile команда, которая примет путь к файлу и откроет его в приложении по умолчанию для этого типа файла.

В вашем случае вы бы сделали:

import os
os.startfile("C:\folder\file.txt")

Обратите внимание, что этот метод не будет работать в Linux и Mac OSX, для этого вам придется использовать собственные утилиты. (open для OSX и xdg-open в Linux) и запустите их с помощью подпроцесса.

Функция, которую вы пытаетесь использовать, является встроенной в Windows cmd.exe. Поэтому вам нужно установить параметр shell=True. Cmd.exe знает, что делать с файлом, который вы передаете.

Если вы используете shell=False, вы пытаетесь запустить файл как программу, и, следовательно, ничего не происходит, так как файлы.txt не имеют exe-заголовка.

Подробнее об этом читайте в документации.

Читая далее, вы можете узнать, почему использование параметра shell=True может быть ошибкой безопасности. Если вы планируете собирать параметры с помощью пользовательских вводов, вы не должны использовать это, иначе ничто не говорит против этого.

В любом случае, я рекомендую использовать ваш второй пример, потому что он явный. Вы сами решаете, какую программу запустить.

subprocess.Popen("notepad C:\folder\file.txt")
Другие вопросы по тегам