[Python-de] Re: Funktion ueberschreiben?
"Peter J. Holzer" <[email protected]> Sun, 4 Dec 2022 22:07:25 +0100
| Newsgroups | gmane.comp.python.general.german |
|---|---|
| Organization | LUGA |
| Message-ID | <[email protected]> |
On 2022-12-04 14:41, Ulli Horlacher <[email protected]> wrote: > Peter J. Holzer <[email protected]> wrote: >>> In Perl kann man folgendes machen: Ein Modul laden und danach nur eine >>> Funktion nachtraeglich ersetzen. Geht so was auch mit Python? >> >> Ja, wurde ja schon erklärt. > > Nicht konkret genug. > > Im duplicity source code steht an mehreren Stellen: > > from duplicity import dup_time > > > Angenommen mein modifiziertes dup_time.py liegt in > /opt/duply/lib/dup_time.py > > Was muss dann in $PYTHONPATH stehen, damit das geladen wird. So geht das gar nicht, weil Du mit from duplicity import dup_time ja etwas laden willst, das innerhalb von "duplicity" ist. Das muss also schon auch vorkommen: /opt/duply/lib └── duplicity ├── __init__.py └── dup_time.py export PYTHONPATH=/opt/duply/lib Das File __init__.py kann leer sein, aber es muss existieren, damit from duplicity import ... funktioniert. > Und was muss ich in /opt/duply/lib/dup_time.py schreiben um Nach /opt darfst Du schreiben? > /usr/lib/python3/dist-packages/duplicity/dup_time.py > zu laden? Das würde ich nicht machen. Dein duplicity/dup_time.py ersetzt das systemweite. Eventuell kannst Du das File lesen und mit exec ausführen, so wie ich es unten mit dem Script gemacht habe. >> (Was für mich auch eher schleierhaft macht. wie du da ein Wrapper-Script >> unterbringen willst > > Trivial: das steht irgendwo in $PATH weiter vorne. > So was hab ich schon oft gemacht bei anderen Sprachen. Geht es da eigentlich nur um dich oder um alle User des Systems? Ich bin davon ausgegangen, dass letzteres der Fall ist. Aber wenn Du nicht Root bist, solltest Du nichts machen können, was die Funktionalität anderer User beeinflusst. Also irgendwie ist mir nicht klar, welche Rolle Du da spielst und was eigentlich das Ziel ist. >> % cat foo_wrapper >> #!/usr/bin/python3 >> >> import time >> >> def my_asctime(tm): >> return "Gotcha!" >> >> time.asctime = my_asctime >> >> with open("foo") as f: >> code = f.read() >> exec(code) >> % ./foo_wrapper >> Gotcha! > > "foo" waere dann "/usr/bin/duplicity" ? Ja. > Aber da steht doch drin: > import time > was mir meine grad modifizierte time.asctime() Funktion wieder ueberschreibt? Nein. "import" funktioniert ähnlich wie "use" in Perl. Wenn ein Modul schon importiert wurde, wird es kein zweites Mal importiert. >> Was mich wieder zu der Frage zurückführt, wie Du da ein Wrapper-Script >> installieren willst. > > $HOME/bin, /var/tmp/bin, etc D.h. du willst das nur für dich, nicht für die anderen User des Systems? (Dass Du oben /opt erwähnst, widerspricht dem etwas) hp _______________________________________________ python-de Mailingliste -- [email protected] Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an [email protected] https://mail.python.org/mailman3/lists/python-de.python.org/ Mitgliedsadresse: [email protected]