在Python脚本中使用os.system("bash code")调用bash命令是否合适?

8 投票
7 回答
3780 浏览
提问于 2025-04-16 02:45

我在想,在Python脚本里用os.system()来调用bash命令算不算一种好的编程风格?这样做安全吗?

我知道怎么用Bash和Python实现我需要的一些功能,但用Bash实现起来更简单、更直观。不过,我觉得写os.system("bash代码")有点像是偷懒的做法。

具体来说,我想把所有以特定后缀结尾的文件移动到一个目录里。

在bash里可以这样做:*mv .ext /path/to/destination。在Python里(伪代码): for file in directory: if file.endswith("ext"): move file to destination

在这种情况下,我应该怎么做呢?

7 个回答

3

用Python函数来处理这些事情总是更好、更有风格。用Python写一个不依赖操作系统的脚本其实并不难,跟用bash相比更简单。

6

看看Python的shutil模块吧。这个模块提供了一些文件系统的操作,比如移动文件。结合os模块,你应该能找到所有需要的工具。这样做比使用bash命令要好,正如其他人提到的原因。

18

首先,你的例子中用到了 mv,这是 coreutils 中的一个程序,不是 bash 的一部分。

使用 os.system() 来调用外部程序被认为是一种不好的做法,原因有以下几点:

  • 你会创建与特定平台相关的依赖关系。
  • 你会创建与特定版本相关的依赖关系(是的,coreutils 有时也会更新!)
  • 你需要检查外部命令是否存在(并且它们是否在 $PATH 中,用户是否可以执行等)。
  • 你必须用返回代码来检查命令是否出错。用语言内部的错误代码或异常处理会更好。(os.system() 不允许你解析标准输出或错误输出)
  • 你需要自己处理带空格的变量的引号(或者转义它们)。
  • Python 已经为你准备好了相关的库!

可以查查 glob,它用于类似 shell 的模式匹配(也叫 globbing),还有 shutil,正如其他人提到的那样。除此之外,你需要的东西已经在标准库里了。

import glob
import shutil

for extfile in glob.glob('*.ext'):
    shutil.move(extfile,dest)  

另外,不应该使用 os.system(),可以看看 subprocess 模块。

撰写回答