Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
gibt es irgend wo einen Übersicht, welche Module aus der Standard-Lib ein CLI mitbringen? Beim `timeit`-Modul ist das immerhin in der Doku dokumentiert, beim `base64`-Modul jedoch nicht, obwohl es standalone nutzbar ist.
Ich hab in der Doku keine Übersicht oder Merkmale gefunden, anhand derer man solche Module leicht findet. Da offensichtlich nicht mal alle dokumentiert sind, befürchte ich, dass es eine solche Liste in der offiziellen Doku gibt. Wäre toll, wenn jemand da eine Übersicht aus dem Hut zaubern könnte
Auf die Schnelle könntest Du die Module per Subprozess mit dem Argument -h oder --help aufrufen und deren Rückgabe prüfen. Als kleinsten gemeinsamen Nenner sollten benutzbare CLIs den Hilfeschalter verstehen. Wenn Du die Rückgabe den Modulen zuordnest, hast Du Deine Übersicht. Nonsense-CLIs für Testzwecke kannst Du ja aussortieren.
Evtl auch - darauf hoffend, dass sich an gewissen Konventionen gehalten wird - das Prüfen auf eine vorhandene main()-Methode im Modul...
Wahrscheinlich wird es letztlich auf eine Kombination verschiedener Möglichkeiten hinauslaufen. Aber lunars Frage ist schon berechtigt: Wozu braucht man das? Kann ja eigentlich nur aus bloßem Interesse sein, oder?
Also ich finde die Frage nicht „berechtigt“. Das ist doch in etwa mit der Frage vergleichbar welche Kommandozeilenprogramme einem zur Verfügung stehen, wenn man ein bestimmtes Programmpaket installiert. Man möchte halt wissen was einem zur Verfügung steht was man benutzen kann.
@jerch: Ich glaube, es ist sinnvoller, nach "if __name__ == '__main__':" zu suchen. Schließlich muss jedes Modul mit CLI diese Zeile enthalten, um ohne Seiteneffekte importiert werden zu können.
Mit "grep "__name__ == '__main__'" **/*.py(.) | grep -v 'test'" im Modulverzeichnis der Python-Installation sollte man eine recht gute Übersicht erhalten.
@BlackJack: Ich kann mir nicht vorstellen, dass irgendjemand die CLIs von Modulen benutzen möchte, von Sonderfällen wie timeit und unittest einmal abgesehen. Die meisten dieser Schnittstellen sind wohl Relikte aus der Zeit vor der Standardbibliothek oder dienen lediglich zum Testen, sind wahrscheinlich völlig veraltet, primitiv und mithin aus guten Grund undokumentiert. Statt "base64.py" kann man schließlich auch einfach das normale "base64" Tool verwenden.
@lunar: Das normale base64 ist nur unter Unix normal. Unter Windows kann es deshalb schon ganz praktisch sein, wenn man Python drauf hat, dass man das gleich benutzen kann.
Die Idee mit einem Test auf `if __name__ == "__main__:"` erscheint mir gut; werde ich mal testen.
@lunar und snafu: BlackJack hat das schon ziemlich richtig erkannt. Unter Linux kenne ich auch genügend Alternativen für die meisten Probleme (`tabnanny` wäre da jedoch ein Gegenbeispiel btw.). Aber unter Windows mag das ein oder andere doch mal ganz praktisch sein.
@jerch: Leider scheinen diese Module oftmals doch wirklich ziemlich vernachlässigt zu sein; zumindest der CLI-Modus. `-h` klappt bei vielen nicht; zumindest bei denen, die ich manuell ausprobiert hatte.
Und generell: Man kann über Sinn und Unsinn bekanntlich vortrefflich streiten - aber wenn es solche Features schon gibt, dann hätte ich schon erwartet, dass diese dokumentiert sind. Ansonsten könnte man sie ja auch einfach streichen, oder?
Mein erster Impuls war auch, die Sache über das __name__/__main__-Konstrukt abzufragen. Dann hab ich mir aber überlegt, wie oft ich selbst den direkten Aufruf zu Testzwecken nutze - und das kommt relativ häufig vor. Mit einem CLI, das die Funktion nach aussen trägt, hat das dann nix zu tun sondern ist eher ein Usecase oder besteht aus Tests. Jetzt weiss ich nicht, wie strikt die Python-Core-Entwicklung hier abgesteckt ist und den Funktionsumfang des main-Blocks, sofern vorhanden, vorschreibt, erwarten würde ich eher Kraut und Rüben.
Imho sollte ein gutes CLI eine Hilfe anbieten, aber da ist wohl auch der Wunsch Vater des Gedanken.
Die Regex für den grep-Befehl musst Du noch ein wenig erweitern, um halbwegs die Inkarnationen des __name__/__main__-Konstruktes zu erfassen.