Windows

Folgende Funktion kann genutzt werden, um unter Windows ein Programm-Fenster in den Vordergrund zu bringen. Parameter ist der Fenstername (wie er in der Titelleiste steht). Text, der dem Namen nachgestellt ist, wird ignoriert.

def raiseWindowByName(title):
    import win32con
    import win32gui

    wins = []
    win32gui.EnumWindows(lambda x, y: y.append(x), wins)

    for winId in wins:
        winName = win32gui.GetWindowText(winId)
        if winName.startswith(title):
            if win32gui.IsIconic(winId):
                win32gui.ShowWindow(winId, win32con.SW_RESTORE)
                
            win32gui.SetForegroundWindow(winId)
            
            break

Um in Python auf COM-Schnittstellen zugreifen zu können, wird das Modul win32com benötigt. Um die benötigten COM-Wrapper-Klassen zu erstellen muss folgendes Skript ausgeführt werden.

import sys
from win32com.client import makepy

sys.argv = ["makepy", "<PATH_TO_TLB>"]

makepy.main()

Unter neueren Windows-Versionen wird unter Python bei der Namensauflösung für Windows-Rechner (z.B. auch localhost) zuerst eine IPv6-Adresse zurückgegeben. Wenn der anzusprechende Server aber kein IPv6 spricht, kommt es aufgrund der entsprechenden Timeouts zu Verzögerungen beim Verbindungsaufbau.

Eine Lösung wäre es natürlich, IPv6 im Betriebssystem zu deaktivieren. Das hat aber was von „mit Kanonen auf Spatzen schießen“. Man kann Python auch dazu überreden, bei der Namensauflösung nur IPv4-Adressen zu berücksichtigen.

import socket
origGetAddrInfo = socket.getaddrinfo

def getAddrInfoWrapper(host, port, family = 0, socktype = 0, proto = 0, flags = 0):
    return origGetAddrInfo(host, port, socket.AF_INET, socktype, proto, flags)

socket.getaddrinfo = getAddrInfoWrapper

Quelle

Wenn man ein Python-Skript als Windows-Service laufen lässt, kommt man mit sys.argv[0] nicht an den Pfad des Skripts heran. Statt dessen wird der Pfad zu pythonservice.exe zurückgegeben.

Es gibt trotzdem einen Möglichkeit, an den Skript-Pfad zu kommen:

import inspect
path = inspect.currentframe().f_code.co_filename

Modalen Dialog anzeigen:

import os, sys, ctypes

ctypes.windll.user32.MessageBoxA(0,
    "curdir: %s\nexedir: %s\nsys.winver: %s" % (
        os.path.abspath(os.curdir),
        os.path.abspath(os.path.dirname(sys.argv[0])),
        sys.winver,
    ), "%s - Message" % os.path.basename(sys.executable), 0x30
)

  • Zuletzt geändert: 2019-07-26 15:02