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"])
调用正在运行,但它只运行第一个文件。我希望他们都能在自己的终端窗口中运行。
答案 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"])
运算符是惰性的。
这当然假设你希望每个电话都能成功,否则你仍然不会打电话给所有三个电话。所以你最好不要在另一条线上打电话。如果要清理代码,请将其包装在函数中。