Seite 1 von 1

Per CGI herrausfinden, welche Module existieren...

Verfasst: Freitag 19. August 2005, 14:00
von jens
Ich hatte mir vor einiger Zeit ein Modul geschrieben, um zu testen welche Python Module auf dem Webserver zu verfügung stehen. Das Prinzip war einfach, ich habe eine Liste von Modulenamen geschrieben und mein Skript hat einfach versucht die Module zu importieren...

Aber es muß doch eigentlich eine einfachere Methode geben, welche Module so alles verfügbar sind, oder?

Schön wäre es, wenn man dabei unterscheiden könnte, ob es ein Python "internes" Modul ist, oder ein zusätzlich installiertes...

Re: Per CGI herrausfinden, welche Module existieren...

Verfasst: Freitag 19. August 2005, 17:50
von ProgChild
jens hat geschrieben:Ich hatte mir vor einiger Zeit ein Modul geschrieben, um zu testen welche Python Module auf dem Webserver zu verfügung stehen. Das Prinzip war einfach, ich habe eine Liste von Modulenamen geschrieben und mein Skript hat einfach versucht die Module zu importieren...

Aber es muß doch eigentlich eine einfachere Methode geben, welche Module so alles verfügbar sind, oder?
Ich fürchte, es gibt keine. Erst, wenn du versuchst, ein Modul zu importieren, sucht Python nach dem Modul und lädt es. Vorher weis Python von externen Modulen garnix. Als Möglichkeit, kannst du natürlich den Lib ordner von Python durchsuchen. Da sind dann alle Module drinn.
jens hat geschrieben:Schön wäre es, wenn man dabei unterscheiden könnte, ob es ein Python "internes" Modul ist, oder ein zusätzlich installiertes...
Das kannst du, soweit ich weis, nur herausfinden, indem du schaust, ob das Modul im site-packages Verzeichniss liegt, oder nicht.

Re: Per CGI herrausfinden, welche Module existieren...

Verfasst: Freitag 19. August 2005, 18:22
von Leonidas
ProgChild hat geschrieben:Als Möglichkeit, kannst du natürlich den Lib ordner von Python durchsuchen. Da sind dann alle Module drinn.
Am besten gleich den kompletten PYTHONPATH, da dir sonst etwas entgehen könnte.

Verfasst: Freitag 19. August 2005, 18:54
von jens
Interessant... Werde ich mal versuchen... Aber was alles ist ein Python Modul? Alle *.py, *.pyc, *.pyd und *.pyo sind schon mal verdächtig ;)

Verfasst: Freitag 19. August 2005, 19:26
von Leonidas
*.so unter Linux auch. Und Achtung auf *.pth Dateien, diese erweitern auch den Pfad.

Verfasst: Freitag 19. August 2005, 19:35
von ProgChild
Leonidas hat geschrieben:*.so unter Linux auch. Und Achtung auf *.pth Dateien, diese erweitern auch den Pfad.
Es kann aber auch sein, dass im PYTHONPATH .so Dateien liege, die gar keine Python Module sind. Du solltest vielleicht noch zur sicherheit testen, ob sich das Modul auch wirklich importieren lässt.

Verfasst: Freitag 19. August 2005, 22:40
von jens
Danke für die Tips... Ich hab mal was probiert...

Das Testen mit __import__() ist allerdings keine gute Idee, weil das Modul direkt ausgeführt wird, wie z.B. __import__("this") ;-)
Eine bessere varinate ist imp.find_module( name ) das schaut nur nach, ob das Modul vorhanden ist...

Hier mal ein Schnellschuss:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import cgitb;cgitb.enable()
import os, sys, glob, imp

print "Content-type: text/html; charset=utf-8\r\n"
print "<pre>"


class modules:
    def __init__( self ):
        filelist = self.scan()
        modulelist = self.test( filelist )
        self.print_result( modulelist )

    def get_suffixes( self ):
        suffixes = ["*"+i[0] for i in imp.get_suffixes()]
        suffixes = "[%s]" % "|".join(suffixes)
        return suffixes

    def get_files( self, path ):
        files = []
        for suffix in self.get_suffixes():
            searchstring = os.path.join( path, suffix )
            files += glob.glob(searchstring)
        return files

    def scan( self ):
        filelist = []
        pathlist = sys.path
        for path_item in pathlist:
            if not os.path.isdir( path_item ):
                continue

            for file in self.get_files( path_item ):
                file = os.path.split( file )[1]
                if file == "__init__.py":
                    continue

                filename = os.path.splitext( file )[0]

                if filename in filelist:
                    continue
                else:
                    filelist.append( filename )

        return filelist

    def test( self, filelist ):
        modulelist = []
        for filename in filelist:
            try:
                imp.find_module( filename )
            except:
                continue
            modulelist.append( filename )
        return modulelist

    def print_result( self, modulelist ):
        modulelist.sort()
        print "="*80
        for modulename in modulelist:
            print modulename
        print "="*80
        print len( modulelist )

modules()

print "-"*80
print "fertig"

Verfasst: Freitag 19. August 2005, 22:46
von Leonidas
Was soll das eigentlich werden? Eine Art configure?

Verfasst: Freitag 2. September 2005, 06:47
von jens
Leonidas hat geschrieben:Was soll das eigentlich werden? Eine Art configure?
Nein, ich will nur wissen, welche Module verfügbar sind, mehr nicht ;)

Im übrigen kam gerade über die "Daily Python-URL" was rein: http://aspn.activestate.com/ASPN/Cookbo ... ipe/440501 Soll genau das gleiche machen, was ich will...

EDIT: Hab's gerade ausprobiert... Funktioniert allerdings nicht wirklich gut. In dem Recipe wird mit imp.load_module() gearbeitet. Das ist das selbe Problem wie mit __import__(): Dabei wird der __main__-Teil eines Moduls "aktiviert". Da ich mehrere Testskripte hab, in den das so ist, gibt's eine menge unbrauchbarer Ausgaben ;)
Also muß ich doch meine Variante nehmen ;)

Verfasst: Mittwoch 11. Oktober 2006, 19:09
von jens
Eine neue Version als CGI ist hier zu finden:
https://opensvn.csie.org/traccgi/PyLuci ... le_info.py

Verfasst: Mittwoch 11. Oktober 2006, 19:33
von Y0Gi

Verfasst: Donnerstag 12. Oktober 2006, 09:55
von jens
Ist was ähnliches... Mein Modul spuckt allerdings zu jedem Modul noch ein wenig Info aus :)

Probiere es mal aus :)