[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]