如何使用python在多个终端窗口中运行多个文件

时间:2015-05-15 18:12:52

标签: python subprocess

from subprocess import call
call(["python3", "/home/johngr/psdirc/TestBot1.py"]) and call(["python3", "/home/johngr/psdirc/TestBot2.py"]) and call(["python3", "/home/johngr/psdirc/TestBot3.py"])

调用正在运行,但它只运行第一个文件。我希望他们都能在自己的终端窗口中运行。

2 个答案:

答案 0 :(得分:3)

不要只使用and

call(["python3", "/home/johngr/psdirc/TestBot1.py"])
call(["python3", "/home/johngr/psdirc/TestBot2.py"])
call(["python3", "/home/johngr/psdirc/TestBot3.py"])

如果您不希望他们在开始下一次使用之前等待该过程完成Popen:

 Popen(["python3", "/home/johngr/psdirc/TestBot1.py"])
 Popen(["python3", "/home/johngr/psdirc/TestBot2.py"])
 Popen(["python3", "/home/johngr/psdirc/TestBot3.py"])

call 运行args描述的命令。等待命令完成,然后返回returncode属性。 Popen不会等待。

如果您想确保每个进程以非零退出状态退出,请使用check_call,这将为任何非零退出状态引发CalledProcessError。

要为每个终端打开一个终端,您可以gnome-terminal使用-e 在终端内执行此选项的参数

call(['gnome-terminal', '-e', "python3 /home/johngr/psdirc/TestBot1.py"])
call(['gnome-terminal', '-e', "python3 /home/johngr/psdirc/TestBot2.py"])
call(['gnome-terminal', '-e', "python3 /home/johngr/psdirc/TestBot3.py"])

如果要打开标签页,可以使用--tab -e

cmd =['gnome-terminal', '--tab', '-e', 'python3 /home/johngr/psdirc/TestBot1.py',
      '--tab', '-e','python3 /home/johngr/psdirc/TestBot2.py','--tab', '-e', 
      'python 3 /home/johngr/psdirc/TestBot3.py']
call(cmd)

您似乎没有gnome-terminal,所以只需将其替换为lxterminal

call(['lxterminal', '-e', 'python3 /home/johngr/psdirc/TestBot1.py'])

不确定是否支持--tab选项,我在文档中没有看到对它的任何引用。

答案 1 :(得分:0)

回答更新的问题

使用subprocess.Popen

from subprocess import Popen, PIPE

bot1 = Popen(["lxterminal", "-e", "python3", "-i", "/home/johngr/psdirc/TestBot1.py"], stdout=PIPE, stderr=PIPE, stdin=PIPE)
bot2 = Popen(["lxterminal", "-e", "python3", "-i", "/home/johngr/psdirc/TestBot2.py"], stdout=PIPE, stderr=PIPE, stdin=PIPE)
bot3 = Popen(["lxterminal", "-e", "python3", "-i", "/home/johngr/psdirc/TestBot3.py"], stdout=PIPE, stderr=PIPE, stdin=PIPE)

这会将每个放入自己的窗口。 -i的{​​{1}}选项是在python3脚本完成后使窗口交互。即使您不希望它是交互式的,也没有坏处,因此您可以调试以防出现问题。

我做了一个测试,退出此脚本后新窗口仍然存在。

回答原始问题

我不建议将其用于生产代码,但是:

TestBot3.py

Python将bash“Good”返回代码0视为False,not call(["python3", "/home/johngr/psdirc/TestBot1.py"]) \ and not call(["python3", "/home/johngr/psdirc/TestBot2.py"]) \ and not call(["python3", "/home/johngr/psdirc/TestBot3.py"]) 运算符是惰性的。

这当然假设你希望每个电话都能成功,否则你仍然不会打电话给所有三个电话。所以你最好不要在另一条线上打电话。如果要清理代码,请将其包装在函数中。