Избежание оболочки = Правда в Попене
Я пытаюсь открыть .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")