使用os.system(“bash code”)在Python脚本中调用bash命令是否很好?

时间:2010-08-13 18:35:29

标签: python security bash scripting embedding

我想知道使用os.system()在Python脚本中调用bash命令是否合适。我也想知道这样做是否安全。

我知道如何在Bash和Python中实现我需要的一些功能,但在Bash中实现它更简单,更直观。但是,我觉得编写os.system(“bash code”)非常hack。

具体来说,我想将所有以特定扩展名结尾的文件移动到目录。

在bash中:* mv .ext / path / to / destination 在Python(伪代码)中:  对于目录中的文件:     if file.endswith(“ext”):         将文件移动到目的地

在这种情况下,我该怎么办?

7 个答案:

答案 0 :(得分:17)

首先,您的示例使用 mv ,这是 coreutils 中的程序,而不是bash。

使用os.system()调用外部程序被认为是不好的风格,因为:

  • 您正在创建特定于平台的依赖项
  • 您正在创建特定于版本的依赖项(是的,甚至有时会更改coreutils!)
  • 您需要检查是否存在外部命令(并且它们位于$ PATH中,并且可由用户执行等)。
  • 您必须使用返回代码包装错误检查命令。使用语言错误代码或异常会更好。 (os.system()不允许你解析stdout / stderr)
  • 您必须自己处理引用变量(或转义它们)
  • Python已经通过提供库完成了这项工作!

查找 glob ,用于类似shell的模式匹配(globbing)和 shutil ,正如其他人已经提到的那样。否则,您需要的所有内容都已存在于标准库中。

import glob
import shutil

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

此外,不应使用 os.system() - 请改为使用子流程模块。

答案 1 :(得分:6)

查看Python的shutil模块。它提供文件系统操作,如移动文件。在它和os模块之间,您应该拥有所需的所有工具。由于其他人说的原因,这比bash命令更好。

答案 2 :(得分:3)

使用Python函数来做这种事情总是越来越好。使用Python,以独立于操作系统的方式编写脚本并不困难,而不是使用bash。

答案 3 :(得分:2)

你应该使用纯Python的一些原因,

  1. 通过使用Python,您已经假设安装了Python和标准库。通过在Python中使用Bash代码,您可以假设 plus 假设Bash已安装并且在系统路径上。
  2. 通过结合使用两种语言,您可以让代码更难以阅读(不是每个人都知道Python Bash)
  3. 如果你以Python的方式做到这一点,不久就会感觉更自然 - 更少的代码行并不总是更好
  4. 在这种情况下,我会使用......

    import os
    for filename in os.listdir('.'):
      if filename.endswith('.ext'):
        os.rename(filename, os.path.join('path', 'to', 'new', 'destination', filename))
    

    可能有更好的方法

答案 4 :(得分:1)

这不是主意,因为它使您的脚本很多的可移植性降低。本机python脚本可以在安装了正确python库的任何unix或windows机器上运行。当你将shell命令添加到混合中时,你会破坏它,然后突然被锁定到一个更窄的子集。

有时你没有选择,但是如果它就是那么简单,那么在python中原生地编写代码会更有意义,而且启动速度也更快(因为python进程不需要生成一个新的shell只是为了执行一个命令。)

答案 5 :(得分:1)

引用问题本身就表明纯Python解决方案更可取。

答案 6 :(得分:0)

更一般地说,Python提供了“子进程”模块,它允许您运行命令并对其输出进行广泛的控制。它允许您“生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回代码”:

http://docs.python.org/library/subprocess.html