python: dynamisch modules laden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoihoi


Ik ben bezig met een projectje waarbij ik dynamisch een aantal patches wil laden en deze uitvoeren tegen een database aan.
Dit gebeurt in python.


Hiervoor heb ik een applicatietje geschreven met een aantal basale functies (list installed patches, show updateable patches, install patch X, remove patch Y etc). In feite is dit een heel rudimentaire package-manager, maar dan voor een database.
De patches worden aangeleverd door mij en mijn collega in de vorm van een Python module met daarin een class.

De class erft over van een base class PatchBase die een aantal methodes zoals remove() install() etc definieert. Ook wordt er in de class zelf de naam van de patch opgeslagen en een versie van de patch. Deze versie is handig; als je een oude database hebt moet je eerst de oudste versie van de patch installeren, daarna de een-na-oudste etc tot je bij de nieuwste bent.

Dependencies tussen patches zou handig zijn maar heb ik (nog) niet geimplementeerd, omdat hier de noodzaak niet toe bestaat.


Wat me nu stoort is dat bij het uitbrengen van een nieuwe patch, deze handmatig in de file met de main functie moet worden geladen middels een een import, en daarna wordt een instance van die class in een list gezet.

Op zich werkt het prima, maar het is lelijk en foutgevoelig.

Nu weet ik dat een aantal talen het dynamisch laden van classes ondersteunt, echter vind ik niet hoe dit in python kan.
Als ik de module laat kan ik met reflectie wel uitzoeken welke classes ik aantref en die instantieren... dus dat is het probleem niet.

Wat ik echter vind is:

http://technogeek.org/python-module.html

Hier wordt gesproken over hoe je modules kunt laden als je de naam al weet. Nu kan ik wel een ls patches/* doen en die dan een voor een gaan laden, maar dat vind ik ook niet echt mooi. De overige dingen die ik vind over dynamische classes gaat over CLI gebruik, en nog wat dingen waar ik niet direct iets mee kan.

Heeft iemand hier een goede tip voor me? :)


Een standaard tooltje voor dit doel is hardstikke leuk maar ik lijd vandaag aan het not-invented-by-me syndroom ;).

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Je kunt in beginsel met __import__() een module importen waar je de naam van weet (je geeft de naam mee als argument, als een string). Gewoon iteraten over een directory werkt op zich goed. Maar je kunt ook eens kijken naar pkg_resources, een stdlib module die helpt bij dit soort dingen.

Rustacean


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Boudewijn schreef op vrijdag 08 januari 2010 @ 20:29:
Hier wordt gesproken over hoe je modules kunt laden als je de naam al weet. Nu kan ik wel een ls patches/* doen en die dan een voor een gaan laden, maar dat vind ik ook niet echt mooi.
Dit is toch wel wat je wil of niet? Je kan trouwens ook prima python gebruiken om te kijken welke bestanden er in een directory zitten:
Python:
1
2
3
import os
for f in os.listdir("."):
  #doe iets met bestand/dir

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Uiteraard kan dat, maar is dit nou de mooiste optie?


Hmm nu ik er over nadenk: ik zou niet weten hoe het mooier kan.. :(.

[ Voor 41% gewijzigd door Boudewijn op 08-01-2010 21:52 ]

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hmm goed, de initiele vraag is opgelost dmv __import__ (bedankt!).

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    def createPatchList(self):
     
        patchfiles =filter((lambda x: x.endswith(".py")),os.listdir("patches"))    
        patchfiles = map((lambda x: x[0:len(x)-3] ),patchfiles)
        
        sys.path.append(os.curdir+"/patches/")        
        
        for f in patchfiles:
            __import__(f)                   
        
        #doe iets met bestand/dir
        patchlist = []     
        return patchlist


Probleem is nu wel dat ik de modules heb geladen maar, ik denk de dir functie te moeten gebruiken om de inhoud van een module te zien: http://docs.python.org/library/functions.html#dir

Echter ,als ik dit zo doe:

code:
1
2
3
 for f in patchfiles:
            __import__(f)    
            print dir(f)

Gaat python dir aanroepen op f als str object, wat logisch is... maar ik wil het gebeurt op de module met de naam f.

Hoe doe ik dat?

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Nu online

RayNbow

Kirika <3

Kijk eens voor de gein naar wat __import__ retourneert. ;)

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Argh, dat had ik moeten weten.

Ja, dat is stom.

i3 + moederbord + geheugen kopen?

Pagina: 1