Per CGI herrausfinden, welche Module existieren...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Interessant... Werde ich mal versuchen... Aber was alles ist ein Python Modul? Alle *.py, *.pyc, *.pyd und *.pyo sind schon mal verdächtig ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

*.so unter Linux auch. Und Achtung auf *.pth Dateien, diese erweitern auch den Pfad.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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"

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was soll das eigentlich werden? Eine Art configure?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Eine neue Version als CGI ist hier zu finden:
https://opensvn.csie.org/traccgi/PyLuci ... le_info.py

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ist was ähnliches... Mein Modul spuckt allerdings zu jedem Modul noch ein wenig Info aus :)

Probiere es mal aus :)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten