从platform.popen移植到subprocess.Popen?

时间:2011-08-11 12:28:38

标签: python subprocess

我有一堆代码使用popen包中旧的已弃用的platform。由于不推荐使用,我将把它移到subprocess包中。

popen("some_command")的等效声明是什么? popen被弃用是否有原因?

1 个答案:

答案 0 :(得分:0)

  • platform.popen并未被我最大限度地弃用。但是,这是一个低级功能,出于灵活性和便携性的原因,您不应该使用它。

  • 很多其他流程启动的东西都被弃用了,而且在Python 3中删除了一些。很多很多尝试都是在Python的历史中做的,并且subprocess.Popen及其便利功能是通过最好的。在其存在之后,其他人变得残酷,大部分保留的只是支持遗留代码。

  • 如果您要移植代码以使用subprocess模块,不要寻找与您一直在做的完全等效的内容,否则您将错过更好的方式。阅读并理解subprocess文档,并了解其用于解决流程启动问题的想法,而不是旧版本。

    subprocess.Popen如何比旧的替代品更好?

    • 安全。我们something('shell command here')代替Popen(['shell', 'command', 'here'])。这不会启动一个不必要的shell进程,这使得它更少错误和危险。

      考虑我是否要求用户输入他们的名字。我可能会在旧事中写something('foo %s" % name)。它应该工作 - 如果用户给你的名字是“Mike”,那么它就变成了foo Mike之类的命令。但如果用户的名字是“Mike Graham”怎么办?然后我想要foo 'Mike Graham'。所以现在我总是放入撇号,但现在如果用户的名字是"Mike O'Reilley"怎么办?更糟糕的是,如果他的名字是"Mike; rm -rf /"怎么办?这里的解决方案不是试图逃避这些(这很难做到,更不用说做跨平台了),而是直接传递参数而不用打扰shell - Popen(['foo',name] )`。

    • 灵活。您可以完全控制输入和输出。

    • 这是非阻止。 Popen可以与您同时运行流程。