Seite 1 von 1

Wie setzt man einen Programm-Schliesser um?

Verfasst: Freitag 11. Juni 2010, 19:16
von jonas
Hi Leute,

Ich suche einfach nach einer möglichst allgemeinen Lösung, während das Programm mit subprocess
gestartet wurde mitzubekommen, welche Tasten gedrückt wurden und je nach dem das Programm zu
schliessen, muss also keineswegs pygame sein.
Ich dachte an sowas wie das folgende, aber das Programm reagiert in keinster Weise -.- :

Code: Alles auswählen

#!/usr/bin/python

## Program-Closer

import pygame
import subprocess

PROGRAM_PATH = "/usr/games/blobby"

def main():
    pygame.init()
    pygame.key.set_repeat(1, 30)
    proc = subprocess.Popen(PROGRAM_PATH)
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                proc.kill()
                running = False
            if event.type == KEYDOWN:
                pygame.event.post(pygame.event.Event(QUIT))
    
if __name__ == "__main__":
    main()
Lg, Jonas :wink:

Re: Wie setzt man einen Programm-Schliesser um?

Verfasst: Samstag 12. Juni 2010, 20:01
von str1442
Wenn ich richtig liege, erreichst du das nur, wenn du dich direkt an den jeweiligen "Keypress / Window Manager" dranklemmst - unter GNU/Linux ist das meist Xorg. Ich habe (ohne wirklich Ahnung von Xorg / Xlib etc zu haben) schnell das folgende in C zusammengeschrieben:

Code: Alles auswählen

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <signal.h>
#include <sys/types.h>

#include <X11/Xlib.h>
#include <X11/keysym.h>

#define PROGRAM_INVOKATION "/usr/games/solarwolf"

void
enter_quit_searching_loop(Display *display /* , pid_t pid */) {
	XEvent e;
	KeySym k;

	while(true) {
		XNextEvent(display, &e);

		if(e.type == KeyPress) {
			k = XKeycodeToKeysym(display, e.xkey.keycode, 0);

			/* Add the necessary stuff here */
			if(k == XK_Escape) {
				/* kill(pid, SIGINT); */
				return;
			}
		}
	}
}

int
main(void) {
	Display *display;
	FILE *program_fp;

	if((display = XOpenDisplay(NULL)) == NULL) goto out;
	if((program_fp = popen(PROGRAM_INVOKATION, "r")) == NULL) goto out_2;

	enter_quit_searching_loop(display);

	pclose(program_fp);
	out_2:
	XCloseDisplay(display);
	out:
	return EXIT_SUCCESS;
}
Kompilieren mit -lX11. Das funktioniert so nicht, entspricht aber in etwa deinem Prinzip - vielleicht kann jemand mit mehr Ahnung von Xlib hier weiterhelfen, und vielleicht gibt es auch eine Python Anbindung an Xlib. Wie gesagt, wenn ich richtig liege und man mit Xlib diese Ereignisse allgemein abfangen kann. Was für ein Problem willst du denn überhaupt lösen, warum brauchst du diese allgemeine Möglichkeit, ein Programm zu beenden? Und dieses Beenden müsste hier sowieso mittels kill() / KeyboardInterrupt erreicht werden, was bei vielen Programmen nicht die feine Art ist.

ADD: Die C Quelltexteinbettung wandelt & in & um.

Re: Wie setzt man einen Programm-Schliesser um?

Verfasst: Samstag 12. Juni 2010, 20:06
von noisefloor
Hallo,

subprocess unterstützt ja auch die Kommunikation dem dem gestarteten Programm via stdin/stdout (Pipes). Wenn das Prog als die die Tastendrücke via stdout ausgibt, kannst du sie dir auch holen (geht auch andersrum, also via stdin senden).

Siehe http://docs.python.org/library/subprocess.html

Gruß, noisefloor