externer Aufruf von help()

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.
Antworten
ScribusP
User
Beiträge: 3
Registriert: Freitag 24. April 2020, 15:02

Hallo,

mein Versuch mehr Python zu lernen war bisher etwas schnodderig. Deshalb würde ich jetzt gerne die ersten Schritte nochmal aufmerksam gehen. Hierzu möchte ich gerne von einem Script ausgehend die Ausgabe der help()-Funktion in eine Datei schreiben. Der Code sieht wie folgt aus:

Code: Alles auswählen

#!/usr/bin/env python3

from sys import stdout
import contextlib

with open('help.txt', 'w') as f:
    with contextlib.redirect_stdout(f):
        help()

with open('symbols.txt', 'w') as f:
    with contextlib.redirect_stdout(f):
        help(symbols)

with open('keywords.txt', 'w') as f:
    with contextlib.redirect_stdout(f):
        help(keywords)

with open('topics.txt', 'w') as f:
    with contextlib.redirect_stdout(f):
        help(topics)
Das Problem ist jetzt dass die Funktion help() eine Eingabe erwartet. Zumindest ist das meine Vermutung weil ich den Command-Prompt nicht zurück bekomme. Wie kann ich das machen?


P.
Benutzeravatar
noisefloor
User
Beiträge: 4193
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

korrekt ist, dass `help()`ohne Argument eine interaktive Session startet, wo du Hilfe zu Thema $FOO abrufen kannst -> ist also nicht wirklich für ein Skript geeignet. Die anderen drei `help(...)` Aufrufe gibt es gar nicht, weil es diese Hilfstehmen gar nicht gibt.

Generell halte ich den Ansatz von dir so oder so für falsch. Was `help($FOO)` ausgibt ist nicht zum Lernen gedacht, sondern zum Nachschalgen / als Gedächnisauffrischung, wenn man mal was vergessen hat. Die allermeisten Hilfstexte sind zu kompakt, um damit Lernen zu können. Zum Lernen solltest du das offizielle Tutorial auf docs.python.org durcharbeiten und dann, wenn du progammierst, die Doku des jeweiligen Moduls. Die sind normalerweise wesentlich ausführlicher geschrieben, inkl. Beispielen.

Gruß, noisefloor
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@ScribusP: help ist nur ein Wrapper für das pydoc-Modul. Dort kann man flexibler arbeiten:

Code: Alles auswählen

import pydoc
with open('help.txt', 'w') as f:
    helper = pydoc.Helper(output=f)
    helper.intro()

with open('symbols.txt', 'w') as f:
    helper = pydoc.Helper(output=f)
    helper.listsymbols()
Aber warum willst Du Dir die Hilfe aus Python heraus ausgeben lassen, statt die Documentation im Web zu benutzen?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Das ist doch viel cooler einen Webserver auf dem eigenen PC mit der Doku zu starten.
Stell dir vor, du bist in einem Safe eingeschlossen, hast keine Internetverbindung und brauchst Dokumentation.

Windows:

Code: Alles auswählen

py -3.8 -m pydoc -n localhost
Linux:

Code: Alles auswählen

python3.8 -m pydoc -n localhost
Oder man generiert sich die Docs, die man hier findet: https://docs.python.org/

Dazu den Quellcode herunterladen. Wenn man eine bestimmte Python-Version möchte, kann man die Tags auswählen und dann den Quellcode herunterladen.
Geht auch via git.

Jedenfalls können die Dokumente mit Sphinx generiert werden. Im Verzeichnis `cpython-x.x.x` ist das Verzeichnis `Doc`.
Dort hineinwechseln und dann `make` bzw. make.bat aufrufen. Die Abhängigkeiten zum Erstellen der Dokumentation werden heruntergeladen.
Dann noch mal `make html`

Die Ausgabe ist dann in Doc/build/

Viel Spaß beim Erstellen einer Offline-Dokumentation.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
ScribusP
User
Beiträge: 3
Registriert: Freitag 24. April 2020, 15:02

Schade um die Zeit und Mühe aller Beteiligten.

Ich möchte nicht, dass mein Vorhaben bewertet und als falsch dargestellt wird.
Und ich bin nicht hier um cool zu werden.

Für den Fall, dass man ein Problem nicht lösen kann gibt es ja die Möglichkeit sich ohne etwas zu schreiben etwas anderem zu zuwenden.


P.
Benutzeravatar
noisefloor
User
Beiträge: 4193
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich möchte nicht, dass mein Vorhaben bewertet und als falsch dargestellt wird.
Na ja, selbst die besten hier im Forum posten ab und an mal Code, der falsch / verbesserungswürdig ist. Und das wird dann auch gesagt. Wenn du das nicht willst oder damit umgehen kannst, dann solltest du für dich entscheiden, wie sinnvoll es ist, hier überhaupt nochmal eine Frage zu stellen. Weil: die Chancen, dass die Antwort(en) nicht deiner Erwartungshaltung entsprechen, sind schon ziemlich hoch.

Gruß, noisefloor
ScribusP
User
Beiträge: 3
Registriert: Freitag 24. April 2020, 15:02

Du verdrehst meine Aussage damit sie zu Deiner Kritik passt.

Mein Vorhaben ist nicht gleich mein Code. Der Code kann von mir aus sein was er will. Hier geht es um Ettiquette.
Benutzeravatar
noisefloor
User
Beiträge: 4193
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ok. Dann sag' doch mal, wie du es gerne gesagt bekommen würdest, dass a) dein Code so nicht funktionieren kann und b) du selbst mit funktionierendem Code nicht dahin kommen würdest, wo du gerne hin willst.

Dann können die, die in Zukunft immer noch genug Motivation haben, dir helfen zu wollen, vielleicht Rücksicht auf deine persönlichen Empfindlichkeit bzgl. Ettiquette nehmen.

Gruß, noisefloor
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@ScribusP: wenn Dir eine Meinung nicht gefällt, dann ignorier sie doch einfach. Hier darf jeder seine Meinung schreiben und ein ›halte ich‹ drückt eine persönliche Meinung aus, und nicht eine generelle Herabwürdigung Deiner Idee.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@ScribusP: Ich denke, du siehst das falsch. Du bekommst in den ersten beiden Antworten auf deinen Beitrag nicht nur die Erklärung warum es nicht geht sondern zusätzlich auch die Information, wie es trotzdem funktionieren könnte. _Zusätzlich_ bekommst du aber einen extremen Mehrwert geliefert. Nämlich viel mehr als eine schnöde Antwort. Und dieser Mehrwert ist in meine Augen nicht Negatives sondern etwas Positives. Weil du aus deinem eigenen Suppenteller - den jeder von uns hat - heraus kommst und du von der Erfahrung anderer profitieren kannst. Ich denke, das ist eher etwas Positives als etwas Negatives - sonst wird die Weiterentwicklung schwer.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DeaD_EyE: Das was man unter https://docs.python.org findet kann man sich in der Tat generieren. Aber da ist oben links auch ein Link Download these documents wo man das schon fertig herunterladen kann. In verschiedenen Formaten: PDF, HTML, Text, und EPub.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

ScribusP hat geschrieben: Freitag 21. August 2020, 10:51 Und ich bin nicht hier um cool zu werden.
Nicht? Ich habe jetzt eine Stunde nach einer Möglichkeit mit pydoc gesucht und eine gefunden.
Habe ich gemacht, weil ich das selbst wissen wollte.

Die einfachste Variante außerhalb eines Python-Programs ist über das Modul pydoc:

Code: Alles auswählen

python -m pydoc
pydoc - the Python documentation tool

...

pydoc -w <name> ...
    Write out the HTML documentation for a module to a file in the current
    directory.  If <name> contains a '/', it is treated as a filename; if
    it names a directory, documentation is written for all the contents.
Der einfache Text-Modus als Ausgabe in Dateien wird aber nicht direkt unterstützt.


Und programmatisch:

Code: Alles auswählen

import pydoc
from pathlib import Path


TOPICS = tuple(pydoc.help.topics)


def write_topic(topic, root="."):
    if topic.upper() not in TOPICS:
        raise ValueError(f"Topic {topic} not found")
    target = Path(root, topic).with_suffix(".txt")
    with target.open("wt", encoding="utf8") as fd:
        text, _ = pydoc.help._gettopic(topic)
        fd.write(text)


if __name__ == "__main__":
    help_dir = Path.home() / "python-help"
    help_dir.mkdir(exist_ok=True)

    for topic in TOPICS:
        write_topic(topic, help_dir)
Also pydoc ist etwas komisch implementiert.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten