过去几个月我一直在教自己python,我终于开始做一些有用的事了。
我最终要做的是拥有一个充当队列的python脚本。也就是说,我想有一个包含一堆输入文件的文件夹,另一个程序用它来运行计算(我是理论物理学家,每天做很多计算工作)。
我现在必须这样做的方法是将所有输入文件放在带有计算软件的盒子上。然后我必须将dos输入文件转换为unix(dos2unix),然后我必须将新的输入文件复制到名为'INPUT'的文件中。最后,我运行一个启动工作的命令。
所有这些任务都在命令提示符下处理。我的问题是如何使用命令提示符连接程序?然后,我如何监视进程(我通常通过cpu使用和TOP命令执行),并在上一个作业完成后让python启动下一个作业。
抱歉漫无目的,我只是不知道如何从脚本中控制命令提示符,然后让它自动“监视”该作业。
由于
答案 0 :(得分:6)
subprocess模块有许多用于在python中执行系统命令的工具。
from subprocess import call
call(["ls", "-l"])
调用将等待命令完成并返回其返回码,因此您可以在知道前一个完成后再调用另一个。
os.system
是一种较旧的方法,但工具较少,不推荐使用:
import os
os.system('"C:/Temp/a b c/Notepad.exe"')
编辑 FvD留下了一条评论,解释了如何“观察”下面的过程
答案 1 :(得分: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中完成你需要的所有事情。