在 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")
我正在尝试打开 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")