开发者

Porting from platform.popen to subprocess.Popen?

开发者 https://www.devze.com 2023-03-27 15:28 出处:网络
I have a bunch of code that uses the old dep开发者_C百科recated popen from the platform package.Since this is deprecated, I will be moving this to the subprocess package.

I have a bunch of code that uses the old dep开发者_C百科recated popen from the platform package. Since this is deprecated, I will be moving this to the subprocess package.

What is the equivalent statement to popen("some_command")? Is there a reason that popen was deprecated?


  • platform.popen has not been deprecated as best as I can tell. However, this is a low-level function that you should not make use of for flexibility and portability reasons.

  • Lots of other process-launching things were deprecated and some removed in Python 3. Many, many attempts at doing this well were made in the history of Python, and subprocess.Popen and its convenience functions are by far the best. After its existence the others became cruft and most of the retained ones are just there to support legacy code.

  • If you're going to port your code to use the subprocess module, don't look for an exact equivalent to what you have been doing, or you will miss out on the ways in which it is better. Read and understand the subprocess documentation and understand the ideas it is using to solve the problem of process-launching better than the older alternatives.

    How is subprocess.Popen better than the older alternatives?

    • It is secure. Instead of something('shell command here'), we do Popen(['shell', 'command', 'here']). This doesn't launch an unnecessary shell process, which makes it less errorprone and dangerous.

      Consider if I asked the user for their name to be input. I might write something('foo %s" % name) in the old thing. It should work--if the user gives you the name "Mike", then it becomes a command like foo Mike. But what if the user's name is "Mike Graham"? Then I want foo 'Mike Graham'. So now I always put in the apostrophes, but now what if the user's name is "Mike O'Reilley"? Worse yet, what if his name is "Mike; rm -rf /"? The solution here isn't to try to escape these yourself (which is hard to do right, let alone to do cross-platform), but to pass the arguments directly without bothering with the shell--Popen(['foo', name])`.

    • It is flexible. You can control the input and output fully.

    • It is nonblocking. Popen can run a process concurrently with yours.

0

精彩评论

暂无评论...
验证码 换一张
取 消