在Python脚本中使用os.system(“bash代码”)调用bash命令是一种好的风格吗?

在Python脚本中使用os.system(“bash代码”)调用bash命令是一种好的风格吗?,python,security,bash,scripting,embedding,Python,Security,Bash,Scripting,Embedding,我想知道使用os.system()在Python脚本中调用bash命令是否被认为是一种好的风格。我还想知道这样做是否安全 我知道如何在Bash和Python中实现我需要的一些功能,但是在Bash中实现它更简单、更直观。然而,我觉得编写os.system(“bash代码”)是非常有技巧的 具体来说,我想将以某个扩展名结尾的所有文件移动到一个目录中 在bash中:*mv.ext/path/to/destination 在Python中(伪代码): 对于目录中的文件: 如果文件.endswith(“e

我想知道使用os.system()在Python脚本中调用bash命令是否被认为是一种好的风格。我还想知道这样做是否安全

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

具体来说,我想将以某个扩展名结尾的所有文件移动到一个目录中

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


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

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

这不是个好主意,因为它使脚本的可移植性大大降低。本机python脚本可以在安装了适当python库的任何unix或windows计算机上运行。当您将shell命令添加到混合中时,您打破了这一点,并突然锁定到一个更窄的子集


有时您没有选择,但如果是这么简单的事情,那么用python本机编写代码会更有意义,而且启动速度也会更快(因为python进程不必为了执行一个命令而生成新的shell)。

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

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

您应该使用纯Python的一些原因

  • 通过使用Python,您已经假设安装了Python和标准库。通过在Python内部使用Bash代码,您可以做出这样的假设,再加上Bash已安装并位于系统路径上的假设
  • 通过使用两种语言的组合,您使其他人更难阅读代码(并非所有人都知道Python和Bash)
  • 如果你用Python的方式来做的话,很快就会感觉更自然——更少的代码行并不总是更好
  • 在这种情况下,我会使用

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

    虽然有更好的方法,但首先,您的示例使用mv,它是coreutils中的一个程序,而不是bash

    使用os.system()调用外部程序被认为是一种糟糕的风格,因为:

    • 您正在创建特定于平台的依赖项
    • 您正在创建特定于版本的依赖项(是的,甚至coreutils有时也会更改!)
    • 您需要检查是否存在外部命令(以及它们是否在$PATH中,是否可由用户执行等)
    • 必须使用返回代码对命令进行错误检查。在语言错误代码或异常中使用它要好得多。(os.system()不允许解析stdout/stderr)
    • 你必须自己处理用空格引用变量(或转义)
    • Python已经通过提供库为您完成了这项工作
    查找glob,查找类壳模式匹配(globbing)和shutil,其他人已经提到过。否则,您需要的所有内容都已经在标准库中了

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

    此外,不应使用os.system()——请查看子流程模块

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


    是否可以在自己的bash脚本中实现bash功能,并让python执行bash脚本,而不是将代码直接放在os.system()中?(使用最好的工具)好的,非常感谢你的帮助!你的回答澄清了我头脑中的一些误解。我真的很感激所有的答案。如果您使用glob.glob('*.ext')而不是os.listdire,那么您可以删除文件.endswith()。这是一个很好的答案,但是当我看到名为“file”的变量时,我会有些畏缩,因为它隐藏了内置的文件。很好的注释-编辑:)这是一个很好的答案,但是对于那些想了解更多bash->python迁移信息的人,我会链接到它