gpt4 book ai didi

python - 如何在Python 2.7中写入正在运行的程序的另一个终端?

转载 作者:太空宇宙 更新时间:2023-11-03 21:13:57 24 4
gpt4 key购买 nike

我目前正在用 python 编写一个程序来打开 Minecraft 服务器。我已经完成了一个窗口,您可以在其中选择列表中的服务器并启动它或进行备份。当您启动它时,会打开一个新终端(使用 os.system('gnome-terminal...') )并且 java 程序启动。有没有办法从第一个终端向该 java 程序发送一些文本(如命令)?

Here is my code

我已经尝试了很多子流程的方法,但没有得到令人满意的结果。

编辑:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import gtk
import re
import os
import time

active_button = 0

servers = [["Server 1","/home/myname/Desktop/server1","server.jar"],
["Serveur 2","/home/myname/Desktop/server2","server.jar"]]

def button_selection(button, num):
global active_button
state=button.state
if state >= 1:
active_button = int(num)

def validation(widget):
path = servers[active_button][1]
server = servers[active_button][2]
command = """gnome-terminal --working-directory="%s" -e 'java -jar %s'""" % (path, server)
print(command)
os.system(command)

def save(widget):
path = servers[active_button][1]
server = servers[active_button][2]
print "cp -a '%s' /home/myname/Documents/backups_minecraft_servers/%s" % (path+"/world", time.strftime("%d_%m_%Y-%T"))
os.system("cp -a '%s' /home/myname/Documents/backups_minecraft_servers/%s" % (path+"/world", time.strftime("%d_%m_%Y-%T")))
print("Backup finished")

def main():
window = gtk.Window()
vbox = gtk.VBox()
hbox = gtk.HBox()

validate = gtk.Button("Validate")
validate.connect("clicked", validation)

backup = gtk.Button("Backup")
backup.connect("clicked", save)

hbox.pack_start(validate)
hbox.pack_start(vbox)
hbox.pack_start(backup)

buttons = [gtk.RadioButton(None, servers[0][0])]
vbox.pack_start(buttons[0])

for server in servers[1:]:
buttons.append(gtk.RadioButton(buttons[0], server[0]))
vbox.pack_start(buttons[-1])

for i in range(len(buttons)):
buttons[i].connect("toggled", button_selection, i)


window.add(hbox)
window.show_all()
gtk.main()

if __name__=="__main__":
main()

最佳答案

首先,永远不要使用os.system。始终使用 subprocess 模块来启动新进程,因为它可以更好地处理许多边缘情况。 subprocess.check_call 可以做 os.system 可以做的所有事情,甚至更多,并且它会检查错误,这是 os.system 做不到的做。

其次,不要使用 gnome-terminal 创建交互式终端来运行子进程!创建一个伪终端 (pty) 来代替;这样你的程序就可以保持对 child 行为的控制。在幕后,这就是像 gnome-terminal 这样的程序本身的工作原理:它为 shell 和 shell 启动的程序创建一个 pty 来运行,然后从 pty 中读取并呈现以图形方式显示结果。

您的程序可以为每个要运行的子程序创建一个pty,然后您的程序可以与子程序进行通信,就像gnome-terminal一样。您可以使用 Python 标准库中的 pty 模块来完成此操作,但您可能需要考虑使用 pexpect 包,因为它可以大大简化流程。

如果您不需要完整的终端,您可以通过打开通往子进程的管道来更简单地完成此操作。标准库中的 subprocess 模块提供了可用于执行此操作的 Popen 类。

根据您的具体情况,我会推荐pexpect。它易于使用,并且能够为此类工作“做正确的事情”。

关于python - 如何在Python 2.7中写入正在运行的程序的另一个终端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54851966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com