【问题标题】:How to use python subprocess to control command line program correctly?如何使用python子进程正确控制命令行程序?
【发布时间】:2018-03-28 03:31:00
【问题描述】:

我有一个想通过 python 控制的外部命令行程序。使用 subprocess.open 时,它会连续打印终端中的第一个命令。我想一个接一个地输入一系列命令,然后在程序完成运行后终止程序。我尝试了几种不同的方法,但似乎没有任何效果。有人可以告诉我我做错了什么,或者帮助我修复我的代码吗?这就是我所拥有的:

from subprocess import Popen, PIPE
program_location = /Fortran/Program/Here/Program

file_location = /Place/For/Input/File/File.EXP
command_list = [file_location, 'expedt', 'y', 'y', 'x', 'powpref', 'genles']
p = Popen(program_location, stdin=PIPE)

for i in command_list:
    ps.stdin.write(i)

【问题讨论】:

  • 根据您正在执行的 shell,您可能需要用换行符终止每个命令,例如i + '\n'.

标签: python python-3.x subprocess os.system


【解决方案1】:

使用Popen.communicate 将输入行发送到进程并等待它完成。

【讨论】:

  • 最初我尝试进行通信,但它一直在终端中一遍又一遍地打印出一行。 p.communicate(os.linesep.join(command_list)) 不起作用
【解决方案2】:

如果您希望所有命令并行运行,可以在多处理的帮助下运行 subprocess.call。

import subprocess
import multiprocessing

cmd_1 = ["timeout", "15", "ping", "google.com"]
cmd_2 = ["timeout", "15", "ping", "stackoverflow.com"]

cmds = [cmd_1, cmd_2]

for i in range(len(cmds)):
    p = multiprocessing.Process(target=subprocess.call, args=(cmds[i],))
    p.start()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多