【问题标题】:Using python to issue command prompts使用python发出命令提示符
【发布时间】:2013-07-08 21:12:51
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

  • 我认为subprocess 模块是您想要的。这是一个很好的问题,我会告诉你的,但是这里有很多 duplicates
  • 您实际要求的是——从脚本控制命令提示符——很难。但是,当您尝试控制的命令提示符(在本例中为 shell)没有做任何您在 Python 中无法更轻松地做的事情(在本例中为 subprocess)时,您不需要控制提示。

标签: python interface command subprocess prompt


【解决方案1】:

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

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

source

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

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

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

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

【讨论】:

  • 在子进程中,您可以使用 Popen.communicate(input=None) 来“监视”作业,正如 OP 所说的那样。
  • os.systemsubprocess.call 更容易吗?在琐碎的情况下,它的概念数量相同(并且击键次数也大致相同),而一旦出现其他任何情况(例如其中带有空格的参数),它就会变得更加复杂。
  • 我链接到的副本中的似曾相识:p(与os.system讨论)
  • ty @Keyser :) 忘了像我平时那样引用
【解决方案2】:

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

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


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

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

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


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多