On 2022-12-04 14:41, Ulli Horlacher <framstag@rus.uni-stuttgart.de> wrote:
Peter J. Holzer <hjp-usenet3@hjp.at> 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