在Popen中避免shell = True

时间:2015-08-03 07:05:23

标签: python windows shell 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")

但这仅在记事本可用时才有效,因此失去了它的普遍性。

2 个答案:

答案 0 :(得分:2)

如果您正在使用Windows,那么(非可移植)os.startfile命令将获取文件路径并在该文件类型的默认应用程序中打开它。

在你的情况下你会这样做:

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

请注意,此方法不会在Linux和Mac OSX上运行,您必须为此使用自己的实用程序。 (OSX为open,Linux上为xdg-open)并使用子进程启动它们。

答案 1 :(得分:1)

您尝试使用的功能是Windows cmd.exe的内置功能。因此,您需要设置shell = True参数。 cmd.exe知道如何处理您提交的文件。

如果你使用shell = False,你尝试像程序一样启动文件,因此没有任何反应,因为.txt文件没有exe-header。

documentation中了解更多相关信息。

阅读further,你可以找到为什么使用shell = True参数可能是一个安全漏洞。如果您考虑按用户输入组合参数,则不应使用此参数,否则不会反对它。

无论如何,我建议使用你的第二个例子,因为它是明确的。你决定要开始的程序。

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