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

我目前正在用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);这样,您的程序就可以保持对孩子行为的控制。在引擎盖下,这就是像gnome-terminal这样的程序的工作原理:它为shell创建一个pty,并运行由shell启动的程序,然后从pty中读取并以图形方式呈现结果。

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

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

对于您的具体情况,我建议使用pexpect。它很容易使用,并且会为这种工作“做正确的事”。

如何在Python Tkinter中管理带边框标签内的间距? - python

我有一个程序,其中我制作了带边框的标签,但其带边框的位置太接近文本。我想在“边框”和“标签文本”之间给出间距。代码如下。from tkinter import * import tkinter as tk win = Tk() win.title("Labels") win.geometry("800x600+50+50…

Python-crontab模块 - python

我正在尝试在Linux OS(CentOS 7)上使用Python-crontab模块我的配置文件如下:{ "ossConfigurationData": { "work1": [ { "cronInterval": "0 0 0 1 1 ?", "attribute&…

Python Pandas导出数据 - python

我正在使用python pandas处理一些数据。我已使用以下代码将数据导出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…

Python:在不更改段落顺序的情况下在文件的每个段落中反向单词? - python

我想通过反转text_in.txt文件中的单词来生成text_out.txt文件,如下所示:text_in.txt具有两段,如下所示:Hello world, I am Here. I am eighteen years old. text_out.txt应该是这样的:Here. am I world, Hello old. years eighteen a…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…