我正在尝试创建一个可以启动视图窗口(控制台)和命令行的程序。在视图窗口中,它将显示常量更新,而命令行窗口将使用raw_input()
接受影响视图窗口的命令。我正在考虑使用线程,但我不知道如何在新的控制台窗口中启动线程。我该怎么做?
答案 0 :(得分:9)
我同意@stark GUI的方式。
纯粹为了说明这里是一个不推荐的非GUI 方式,它显示了如何使用线程,子进程和命名管道作为IPC。
有两个脚本:
entry.py
:接受来自用户的命令,对命令执行某些操作,将其传递给命令行中给出的命名管道:
#!/usr/bin/env python
import sys
print 'entry console'
with open(sys.argv[1], 'w') as file:
for command in iter(lambda: raw_input('>>> '), ''):
print ''.join(reversed(command)) # do something with it
print >>file, command # pass the command to view window
file.flush()
view.py
:启动入口控制台,在线程中打印常量更新,接受来自命名管道的输入并将其传递给更新线程:
#!/usr/bin/env python
import os
import subprocess
import sys
import tempfile
from Queue import Queue, Empty
from threading import Thread
def launch_entry_console(named_pipe):
if os.name == 'nt': # or use sys.platform for more specific names
console = ['cmd.exe', '/c'] # or something
else:
console = ['xterm', '-e'] # specify your favorite terminal
# emulator here
cmd = ['python', 'entry.py', named_pipe]
return subprocess.Popen(console + cmd)
def print_updates(queue):
value = queue.get() # wait until value is available
msg = ""
while True:
for c in "/-\|":
minwidth = len(msg) # make sure previous output is overwritten
msg = "\r%s %s" % (c, value)
sys.stdout.write(msg.ljust(minwidth))
sys.stdout.flush()
try:
value = queue.get(timeout=.1) # update value
print
except Empty:
pass
print 'view console'
# launch updates thread
q = Queue(maxsize=1) # use queue to communicate with the thread
t = Thread(target=print_updates, args=(q,))
t.daemon = True # die with the program
t.start()
# create named pipe to communicate with the entry console
dirname = tempfile.mkdtemp()
named_pipe = os.path.join(dirname, 'named_pipe')
os.mkfifo(named_pipe) #note: there should be an analog on Windows
try:
p = launch_entry_console(named_pipe)
# accept input from the entry console
with open(named_pipe) as file:
for line in iter(file.readline, ''):
# pass it to 'print_updates' thread
q.put(line.strip()) # block until the value is retrieved
p.wait()
finally:
os.unlink(named_pipe)
os.rmdir(dirname)
要试用它,请运行:
$ python view.py
答案 1 :(得分:6)
不要使用控制台或终端窗口,而是重新检查您的问题。您要做的是创建一个GUI。有许多跨平台的工具包,包括Wx和Tkinter,它们都有小部件可以完全按照你的需要做。用于输出的文本框和用于读取键盘输入的条目小部件。另外,你可以将它们包装在一个带有标题,帮助,打开/保存/关闭等的漂亮框架中。
答案 2 :(得分:0)
更新后的答案:
import subprocess
command = "dir"
subprocess.run(["cmd.exe", "/c", "start", f"{command}"], timeout=15)
“ cmd.exe” -如果使用Windows,则Windows仅识别双引号。
“ / c” -在发送“ dir”(例如)字符串后说“发送退货”。
“开始” -表示打开新的控制台窗口...即使在Pycharm中进行调试:)
f“命令” -我使用f字符串发送汇编字符串Python3.6 +
(超时可选)