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...
Per CGI herrausfinden, welche Module existieren...
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: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?
Das kannst du, soweit ich weis, nur herausfinden, indem du schaust, ob das Modul im site-packages Verzeichniss liegt, oder nicht.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...
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Am besten gleich den kompletten PYTHONPATH, da dir sonst etwas entgehen könnte.ProgChild hat geschrieben:Als Möglichkeit, kannst du natürlich den Lib ordner von Python durchsuchen. Da sind dann alle Module drinn.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.Leonidas hat geschrieben:*.so unter Linux auch. Und Achtung auf *.pth Dateien, diese erweitern auch den Pfad.
- 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:
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"
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Nein, ich will nur wissen, welche Module verfügbar sind, mehr nichtLeonidas hat geschrieben:Was soll das eigentlich werden? Eine Art configure?
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
- 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
https://opensvn.csie.org/traccgi/PyLuci ... le_info.py