Copak dlábí hadi 2

22. 1. 2013 21:11 (aktualizováno) Petr Blahoš

Dnes se budu aspoň v krátkosti věnovat dlouhému tématu: pywin32

OLE

Kromě balnálních záležitostí, jako je zpřístupnění celého Win32 API umí pohodlně pracovat s ActiveX komponentama. Jmenují se pořád ještě ActiveX? Jeden čas to bylo OLE2, někdy taky COM. Takže si představte, že dostanete do ruky nějaký hardware, třeba tiskárnu štítků Brother, a máte ji integrovat do vašeho systému. Jediné, co máte k dispozici je jakýsi OLE objekt. Co teď? No přece: Použije win32com.client. Třeba pro tu mou tiskárnu to je takhle:

    brsscom = win32com.client.Dispatch("BrssCom.Document")
    brsscom.Open(u"C:\\templates\\t1.bin")
    brsscom.DoPrint(0x40000000, u"0")
Ovšem, různé COM objekty budou mít různé API. API k tomu svému najdete v dokumentaci, většinou i s nějakým příkladem ve Visual Basicu.

Jiný příklad ze života: Pokud potřebujete stahovat soubor z webu, který vyžaduje přihlášení, a zároveň jste za proxy, která taky vyžaduje přihlášení do domény, a máte „vstřícné“ IT, tak si se základními knihovnami Pythonu asi nevystačíte. Můžete ale použít WinHttp.WinHttpRequest.5.1:

    o = win32com.client.Dispatch("WinHttp.WinHttpRequest.5.1")
    o.SetProxy(2, "myproxyproxy:8080", "")
    o.Open("GET", url, False)
    o.SetCredentials("domain\username", "password", 1)
    o.SetCredentials("remote_credentials", "remote_password", 0)
    o.Send()
    f = open("localfilename", "wb")
    f.write(o.ResponseBody)
    f.close()

Ve zdrojácích najdete i nějaké ukázky, např. plugin do Excelu jestli má někdo chuť.

ODBC

Pokud neděláte nic vážného a nechcete hned rozjíždět SQLAlchemy s pyodbc, tak vězte, že součástí pywin32 je i odbc klient. Implementuje pouze Python Database API verzi 1, ale na něco menšího to stačí. Nevím, jestli je vůbec nějaký příklad potřeba.

import odbc
db = odbc.odbc("DSNNAME") # DSNNAME je jméno nějaké definované DSN
cursor = db.cursor()
cursor.execute("""select firstname, surname from person""")
i = cursor.fetchone()
while i:
    print i
    i = cursor.fetchone()

cursor.close()
db.close()

win32security

Skriptování a Windows, to nejde dohromady. Tak třeba: Přihlásit se jako admin, spustit nějaký skript a zase se odhlásit? Když navíc chceme nějakou informaci o tom, jestli to vlastně proběhlo?

global userH
userH = None

def login()
    global userH
    userH = win32security.LogonUser(USERNAME, DOMAIN, PASSWORD,
                win32security.LOGON32_LOGON_INTERACTIVE,
                win32security.LOGON32_PROVIDER_DEFAULT)
    win32security.ImpersonateLoggedOnUser(userH)

def logout():
    global userH
    win32security.RevertToSelf()
    win32api.CloseHandle(userH)

Windows Service

win32service a win32serviceutil se dají použít k tomu, že si uděláte kolem vašeho programu obal, který umožní nainstalovat jej jako Windows Service (win32/lib/win32serviceutil­.py:ServiceFramework). Nebo třeba ke spuštění Pyramid aplikace jako service.

A mnoho dalšího

Kdybych měl vyjmenovat, co všechno jsem ještě použil, tak namátkou:

  • Ukončení, případně zabití service (win32serviceutil.StopService, win32service.QueryServiceStatus, win32api.TerminateProcess)
  • Tisk pdfek skrze Acrobat Readera (win32api.ShellExecute(0, „print“, filename, None, „.“, 0))
  • Práce se sériovým portem – teď už bych ale použil pyserial
  • Vytváření zástupců na ploše (hrůza)
  • Shutdown nebo restart počítače

Dnes to bylo spíš o Windows než o Pythonu. Snad se to ale bude někomu hodit.

Sdílet