Python - 何时可以使用 os.system() 执行常见的 Linux 命令
从另一个线程中分离出来,什么时候使用os.system()来执行像rm -rf、cd、make、xterm、ls这样的命令比较合适呢?
考虑到上述命令有类似的Python内置命令(除了make和xterm),我觉得使用这些内置的Python命令会更安全,而不是用os.system()。
有什么想法吗?我很想听听大家的意见。
7 个回答
Darin的回答是个不错的开始。
除此之外,你要考虑你希望程序有多大的可移植性。如果你的程序只会在一个相对“标准”和“现代”的Linux上运行,那就没必要重新发明轮子;如果你试图重新写make
或xterm
,那可就要小心了,可能会有人来找你谈话。如果它能正常工作,而且你不担心平台问题,那就尽管用Python来把东西连接起来吧!
如果你需要在不确定的系统上保持兼容性,那你可以尝试找一些库,帮助你以平台无关的方式完成需要的功能。或者你需要研究一下,如何根据不同的系统,调用一些内置工具,可能它们的名字、路径和使用方式都不一样。
使用system()
的一个问题是,它要求你了解命令行的语法和如何解析这些命令。这可能会导致一些错误,比如你没有正确验证输入,结果命令行可能会以你意想不到的方式处理一些内容,比如变量替换或者判断参数的开始和结束。此外,其他操作系统的命令行语法可能和你当前的系统不同,甚至有些细微的差别你可能一开始就没注意到。基于这些原因,我更喜欢使用execve()
,因为你可以直接传递argv
的参数,这样就不必担心中间的某些东西会错误解析你的输入。
另一个关于system()
的问题(这同样适用于execve()
)是,当你写这段代码时,你实际上是在说:“找这个程序,并传递这些参数。”这就带来了几个假设,可能会导致错误。首先是这个程序确实存在,并且可以在$PATH
中找到。也许在某些系统上,它就找不到。其次,可能在某些系统上,或者在你自己操作系统的未来版本中,它会支持不同的选项。因此,除非你非常确定你要运行的系统上会有这个程序,否则我建议避免这样做。(比如,你可能是把这个程序放在系统上的,或者调用它的方式是由像POSIX这样的标准规定的。)
最后... 查找正确的程序、创建新进程、加载程序等操作都会带来性能损失。如果你只是想做一些简单的事情,比如mv
,直接使用系统调用会更高效。
这些只是避免使用system()
的一些原因,肯定还有更多。
简单来说,如果有现成的Python函数可以完成某个功能,就用这个函数。为什么呢?因为这样可以让你的代码在不同的系统上都能运行得很好,更安全,而且可能会更快,因为不需要再启动一个额外的进程。