Python 会很好地替代 Windows 命令行/批处理脚本吗?

Posted

技术标签:

【中文标题】Python 会很好地替代 Windows 命令行/批处理脚本吗?【英文标题】:Would Python make a good substitute for the Windows command-line/batch scripts? 【发布时间】:2010-09-17 20:19:38 【问题描述】:

我对@9​​87654321@ 有一些经验,我不介意,但现在我正在做很多 Windows 开发,我需要做一些基本的事情/编写基本的脚本使用 Windows 命令行语言。出于某种原因,这种语言真的让我很恼火,所以我正在考虑学习 Python 并改用它。

Python 适合这样的事情吗?移动文件,创建脚本来执行解压缩备份和恢复 SQL 数据库等操作。

【问题讨论】:

是的!我是最近的皈依者。我曾经编写大量的 Windows bat 文件(加上 NAnt)来完成这些任务,然后切换到 Python,我无法相信它变得如此简单和高效。 见***.com/questions/209470/…。 Windows 的答案与 bash 完全相同。 【参考方案1】:

Python 非常适合这些任务,我猜想在开发和调试方面比 Windows 批处理文件要容易得多。

我认为,问题是,确保运行这些脚本的所有计算机都安装了 Python 是多么容易和轻松。

【讨论】:

很容易将 python 转换为 .exe。在 Windows 上,它还可以很好地链接到 COM 和 Windows 服务【参考方案2】:

总结

Windows:无需思考,使用 Python。 Unix:快速或一次性运行脚本适用于 Bash,严重和/或长寿命脚本适用于 Python。

大话

在 Windows 环境中,Python 绝对是最佳选择,因为 cmd 很糟糕,PowerShell 还没有真正安定下来。更重要的是,Python 可以在多个平台上运行,因此这是一项更好的投资。最后,Python 有一套庞大的库,所以你几乎永远不会碰到“上帝我做不到”的墙。这不适用于 cmd 和 PowerShell。

在 Linux 环境中,这有点不同。许多 one liner 在纯 Bash 中更短、更快、更高效并且通常更具可读性。但是,如果您知道您的快速而肮脏的脚本会保留一段时间或需要改进,请选择 Python,因为它更容易维护和扩展以及you will be able to do most of the task you can do with GNU tools with the standard library。如果不能,您仍然可以从 Python 脚本调用命令行。

当然,您可以使用 -c 选项从 shell 调用 Python:

python -c  "for line in open('/etc/fstab') : print line"

更多关于 Python 用于系统管理任务的文献:

The IBM lab point of view.

A nice example to compare bash and python to script report.

The basics.

The must-have book.

【讨论】:

【参考方案3】:

当然,对于这些任务,python 是一个不错的选择(我相信很多人会推荐 PowerShell)。

从这个角度来看,这是一个很好的介绍:

http://www.redhatmagazine.com/2008/02/07/python-for-bash-scripters-a-well-kept-secret/

编辑:关于 gnud 的关注:http://www.portablepython.com/

【讨论】:

redhatmagazine.com URL 不再存在。 Archive.org 捕获页面:web.archive.org/web/20080517104907/http://…【参考方案4】:

你知道PowerShell吗?

【讨论】:

Powershell(以及 cmd 和 bash)在 python 的美丽旁边是可怕的。是的,我是一个***者:)【参考方案5】:

任何东西都可以很好地替代 Windows 中的批处理文件系统。 Perl、Python、Powershell 都是不错的选择。

【讨论】:

【参考方案6】:

@BKB 肯定有一个合理的担忧。如果遇到任何标准库无法解决的问题,请查看以下几个链接:

Pywin32 是一个用于处理低级 win32 API(高级文件系统修改、COM 接口等)的包 Tim Golden's Python page:他维护了一个基于 Pywin32 构建的 WMI 包装程序包,但请务必查看他的 "Win32 How Do I" 页面,了解有关如何在 Python 中完成典型 Windows 任务的详细信息。

【讨论】:

【参考方案7】:

Python 确实非常适合。如果您要走这条路,您可能还想调查SCons,它是一个使用 Python 构建的构建系统。很酷的是构建脚本本身就是成熟的 Python 脚本,所以你可以在构建脚本中做任何你可以在 Python 中做的事情。相比之下,make 看起来很虚弱。

重读您的问题后,我应该注意到 SCons 更适合构建软件项目,而不是编写系统维护脚本。但无论如何我都会毫不犹豫地向你推荐 Python。

【讨论】:

【参考方案8】:

作为后续,经过一些实验后,我发现 Python 最有用的是任何涉及文本操作(yourStringHere.replace(),正则表达式用于更复杂的东西)或快速测试一些基本概念的情况,它非常适合。

对于 SQL DB 恢复脚本之类的东西,我发现我通常仍然只使用批处理文件,因为它通常要么足够短,以至于实际上需要更多 Python 代码来进行适当的系统调用,要么我可以重用代码的 sn-ps其他人将编写时间减少到足以调整现有代码以满足我的需求。

作为附录,我强烈推荐 IPython 作为一个出色的交互式 shell,具有选项卡完成和简单的文档字符串访问。

【讨论】:

【参考方案9】:

我已经在 Linux/Unix 和 Windows 环境中,在 Python、Perl、批处理文件、Bash 等中编写了大量脚本。我的建议是,如果可能的话,安装 Cygwin 并使用 Bash(听起来您的描述(例如安装脚本语言或环境)没有问题吗?)。你会更舒服,因为过渡是最小的。

如果这不是一个选项,那么这就是我的看法。批处理文件非常笨拙且有限,但对于“复制一些文件”或“重新启动此服务”等简单任务很有意义。 Python 将更简洁、更易于维护且功能更强大。但是,不利的一面是,您最终会使用 subprocess、popen 或类似方法从 Python 调用外部应用程序。否则,您最终会编写更多代码来执行批处理文件中相对简单的事情,例如复制一个装满文件的文件夹。这在很大程度上取决于您的脚本在做什么。例如,Python 中的文本/字符串处理将变得更加简洁。

最后,它可能不是一个有吸引力的替代方案,但您也可以考虑将 VBScript 作为替代方案。我个人不喜欢将它作为一种语言使用,但如果可移植性是任何一种问题,那么它会因为在任何 Windows 副本中开箱即用而胜出。因此,我发现自己在 VBScript 中编写了作为批处理文件的笨拙脚本,因为我通常不能依赖 Windows 上可用的 Python、Perl 或 Bash。

【讨论】:

“复制一个充满文件的文件夹” - 一个标准模块 shutil 可以提供帮助。【参考方案10】:

Python 和 Pywin32 一起适用于 Windows 自动化。但是,与 Windows Scripting Host 一起使用的 VBScript 或 JScript 也能正常工作,并且不需要安装任何其他东西。

【讨论】:

【参考方案11】:

我最近使用了很多Windows Script Files。比批处理脚本更强大,而且由于它使用 Windows 脚本,因此无需安装。

【讨论】:

【参考方案12】:

尽管我很喜欢 python,但我认为它不是替换基本 Windows 批处理脚本的好选择。

我看不到有人必须导入 sys、os 或 getopt 等模块来执行您可以使用 shell 执行的基本操作,例如调用程序、检查环境变量或参数。

另外,根据我的经验,goto 对于大多数系统管理员来说比函数调用更容易理解。

【讨论】:

我发现显式的 os.this 和 sys.that 是 Python 的一个优势。 shell 的随机特性集合很难让人在精神上掌握。 Python 的库使其更易于理解。 我必须同意 S. Lott 的观点。这并没有太多额外的工作,而且明确性使全局命名空间不会混乱。

以上是关于Python 会很好地替代 Windows 命令行/批处理脚本吗?的主要内容,如果未能解决你的问题,请参考以下文章

替代已弃用的 setup_environ() 一次性 django 脚本?

替代已弃用的 setup_environ() 一次性 django 脚本?

python 子进程不能很好地与 gsutil 复制/移动命令一起使用

当y轴值较小时,烛台不能很好地显示

在 Linux 中从 Java 或 Python 访问扫描器(或者其他的,如果它有技术动机的话)(但 Windows 会很好)

zeromq 和 python:没有睡眠命令不发送