在 Popen 中避免 shell=True

Avoiding shell=True in Popen

我正在尝试打开 Windows 中的 .txt 文件。代码如下:

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

这很好用。默认编辑器会自动打开并加载文件,但是,我之前在某处读到通过 shell(Windows 中的cmd.exe)调用调用不太安全。没有它我怎么能做同样的事情。简单地设置 shell=False 给我错误:

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

现在,我可以试试这个作为解决方法:

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

但这只有在记事本可用时才有效,因此失去了通用性。

如果您使用的是 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 头。

documentation 阅读更多相关信息。

阅读 further,您会发现为什么使用 shell=True 参数会成为安全漏洞。如果你考虑 assemble 用户输入的参数,你不应该使用这个,否则没有什么反对的。

无论如何,我建议使用您的第二个示例,因为它是明确的。您决定启动什么程序。

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