我有一堆代码使用popen
包中旧的已弃用的platform
。由于不推荐使用,我将把它移到subprocess
包中。
popen("some_command")
的等效声明是什么? popen被弃用是否有原因?
答案 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
可以与您同时运行流程。