使用 os.system("bash code") 在 Python 脚本中调用 bash 命令是一种好的风格吗? [关闭]

Posted

技术标签:

【中文标题】使用 os.system("bash code") 在 Python 脚本中调用 bash 命令是一种好的风格吗? [关闭]【英文标题】:Is it good style to call bash commands within a Python script using os.system("bash code")? [closed] 【发布时间】:2011-03-29 15:03:41 【问题描述】:

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

我知道如何在 Bash 和 Python 中实现一些我需要的功能,但是在 Bash 中实现它更简单、更直观。但是,我觉得写 os.system("bash code") 很hackish。

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

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

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

【问题讨论】:

能否在自己的 bash 脚本中实现 bash 功能,并让 python 执行 bash 脚本,而不是将代码代码直接放入 os.system() 中? (使用最适合工作的工具) 好的,非常感谢您的帮助!您的回答消除了我脑海中的一些误解。我真的很感激所有的答案。 【参考方案1】:

首先,你的示例使用了mv,它是coreutils中的一个程序,而不是bash。

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

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

查找 glob,用于类似 shell 的模式匹配(通配)和 shutil,正如其他人已经提到的。否则,您需要的一切都已经在标准库中。

import glob
import shutil

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

此外,不应使用 os.system() - 请查看 subprocess 模块。

【讨论】:

很好的答案,但是当我看到名为“file”的变量时,我有点畏缩,因为它隐藏了内置文件。 好评论 - 已编辑 :) 很好的答案,但对于那些寻找更多 bash->python 迁移信息的人,我将链接到 ***.com/questions/209470/…【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

应该使用纯 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))

也许有更好的方法

【讨论】:

如果你使用 glob.glob('*.ext') 而不是 os.listdir,你可以取消 file.endswith()【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

以上是关于使用 os.system("bash code") 在 Python 脚本中调用 bash 命令是一种好的风格吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

os.system("pwd") 和 os.getcwd() 的区别

python os.system、os.popen、subprocess.Popen的区别

python os.system("pause") 显示乱码

Python中Bash反引号的等价物[重复]

在Windows系统下使用pycharm调用os.system("dir")为什么乱码

想在python脚本里面source .profile,调用os.system后在当前运行的脚本里环境变量没有变呢?求解决方法。