Как я могу открыть две консоли из одного script
Помимо скриптов собственной консоли (которая ничего не делает), я хочу открыть две консоли и напечатать переменные con1
и con2
в разных консолях. Как я могу это достичь.
con1 = 'This is Console1'
con2 = 'This is Console2'
Я не знаю, как это сделать, и потратил несколько часов, пытаясь сделать это с помощью таких модулей, как subprocess
, но не повезло. Кстати, я на окнах.
Изменить:
Будет ли работать модуль threading
? или требуется multiprocessing
?
Например:
Ответы
Ответ 1
Если вы не хотите пересмотреть свою проблему и использовать графический интерфейс, например, в @Kevin answer тогда вы можете использовать модуль subprocess
для одновременного запуска двух новых консолей и отображения двух заданных строк в открытых окнах:
#!/usr/bin/env python3
import sys
import time
from subprocess import Popen, PIPE, CREATE_NEW_CONSOLE
messages = 'This is Console1', 'This is Console2'
# open new consoles
processes = [Popen([sys.executable, "-c", """import sys
for line in sys.stdin: # poor man `cat`
sys.stdout.write(line)
sys.stdout.flush()
"""],
stdin=PIPE, bufsize=1, universal_newlines=True,
# assume the parent script is started from a console itself e.g.,
# this code is _not_ run as a *.pyw file
creationflags=CREATE_NEW_CONSOLE)
for _ in range(len(messages))]
# display messages
for proc, msg in zip(processes, messages):
proc.stdin.write(msg + "\n")
proc.stdin.flush()
time.sleep(10) # keep the windows open for a while
# close windows
for proc in processes:
proc.communicate("bye\n")
Здесь упрощенная версия, которая не полагается на CREATE_NEW_CONSOLE
:
#!/usr/bin/env python
"""Show messages in two new console windows simultaneously."""
import sys
import platform
from subprocess import Popen
messages = 'This is Console1', 'This is Console2'
# define a command that starts new terminal
if platform.system() == "Windows":
new_window_command = "cmd.exe /c start".split()
else: #XXX this can be made more portable
new_window_command = "x-terminal-emulator -e".split()
# open new consoles, display messages
echo = [sys.executable, "-c",
"import sys; print(sys.argv[1]); input('Press Enter..')"]
processes = [Popen(new_window_command + echo + [msg]) for msg in messages]
# wait for the windows to be closed
for proc in processes:
proc.wait()
Ответ 2
Вы можете получить что-то вроде двух консолей, используя два виджета Tkinter Text.
from Tkinter import *
import threading
class FakeConsole(Frame):
def __init__(self, root, *args, **kargs):
Frame.__init__(self, root, *args, **kargs)
#white text on black background,
#for extra versimilitude
self.text = Text(self, bg="black", fg="white")
self.text.pack()
#list of things not yet printed
self.printQueue = []
#one thread will be adding to the print queue,
#and another will be iterating through it.
#better make sure one doesn't interfere with the other.
self.printQueueLock = threading.Lock()
self.after(5, self.on_idle)
#check for new messages every five milliseconds
def on_idle(self):
with self.printQueueLock:
for msg in self.printQueue:
self.text.insert(END, msg)
self.text.see(END)
self.printQueue = []
self.after(5, self.on_idle)
#print msg to the console
def show(self, msg, sep="\n"):
with self.printQueueLock:
self.printQueue.append(str(msg) + sep)
#warning! Calling this more than once per program is a bad idea.
#Tkinter throws a fit when two roots each have a mainloop in different threads.
def makeConsoles(amount):
root = Tk()
consoles = [FakeConsole(root) for n in range(amount)]
for c in consoles:
c.pack()
threading.Thread(target=root.mainloop).start()
return consoles
a,b = makeConsoles(2)
a.show("This is Console 1")
b.show("This is Console 2")
a.show("I've got a lovely bunch of cocounts")
a.show("Here they are standing in a row")
b.show("Lorem ipsum dolor sit amet")
b.show("consectetur adipisicing elit")
Результат:
Ответ 3
Я не знаю, подходит ли оно вам, но вы можете открыть два интерпретатора Python с помощью команды Windows start
:
from subprocess import Popen
p1 = Popen('start c:\python27\python.exe', shell=True)
p2 = Popen('start c:\python27\python.exe', shell=True)
Конечно, есть проблема, что теперь Python работает в интерактивном режиме, который не является тем, что вы хотите (вы также можете передать файл как параметр и этот файл будет выполнен).
В Linux я бы попытался сделать именованный канал, передать имя файла в файл python.exe и написать команды python этому файлу. "Может быть", это сработает;)
Но у меня нет идеи о создании именованного канала в Windows. Windows API... (заполнить urself).
Ответ 4
Знаете ли вы о screen/tmux?
Как насчет tmuxp? Например, вы можете попробовать запустить cat
в разделенных панелях и использовать "sendkeys" для отправки вывода (но выкапывать документы, возможно, есть еще более простые способы для этого).
В качестве бонусного бонуса это будет работать в текстовой консоли или графическом интерфейсе.