5

在过去的几个月里,我一直在自学 Python,终于开始做一些有用的事情。

我最终要做的是拥有一个充当队列的python脚本。也就是说,我想要一个包含一堆输入文件的文件夹,另一个程序用来运行计算(我是一名理论物理学家,每天做很多计算工作)。

我现在必须这样做的方法是将所有输入文件放在装有计算软件的盒子上。然后我必须将dos输入文件转换为unix(dos2unix),然后我必须将新的输入文件复制到一个名为'INPUT'的文件中。最后,我运行一个启动作业的命令。

所有这些任务都在命令提示符下处理。我的问题是如何将我的程序与命令提示符连接?然后,我如何监控进程(我通常通过 cpu 使用和 TOP 命令进行),并在最后一个作业完成后让 python 开始下一个作业。

抱歉漫无边际,我只是不知道如何从脚本控制命令提示符,然后让它自动“监视”工作。

谢谢

4

2 回答 2

6

subprocess模块有许多用于在 python 中执行系统命令的工具。

from subprocess import call
call(["ls", "-l"])

来源

call 将等待命令完成并返回其返回码,因此您可以在知道前一个命令已完成之后再调用另一个命令。

os.system是一种较旧的方法,但工具较少,不推荐:

import os
os.system('"C:/Temp/a b c/Notepad.exe"')

编辑FvD 留下评论,解释如何“观看”下面的过程

于 2013-07-10T19:22:43.400 回答
1

如果您确实需要驱动交互式命令行界面,则无法使用 stdlib 执行此操作。

为此有许多第三方选项;我认为pexpect可能是最受欢迎的。


然而,如果你真的不需要交互式地驱动它——如果程序只需要你在命令行上给它参数,或者“批处理模式”转储到它的标准输入,那么subprocess它就很容易了。例如,要驱动sort程序,您可以这样做:

with Popen(['sort', '-n'], stdin=PIPE, stdout=PIPE) as p:
    sorted_data = p.communicate(input_data)

这当然是一个愚蠢的例子,因为你可以sort用 Python 做任何可以用参数做的sorted事情key,而且可能更具可读性。


更一般地说:通常当您认为您需要以交互方式编写某个程序的脚本时,您真的不需要,有时您甚至根本不需要运行它。

而你的特殊情况正是这样的情况。您正在询问以交互方式编写 shell 脚本。但是您实际上并不需要这样做,因为 Python 可以从 shell 中完成您需要的所有事情。

于 2013-07-10T19:49:40.190 回答