2013-05-13 25 views
5

Es gibt einige Python-Code, der unter Linux funktioniert. Es verwendet das PWD-Modul in einer Weise, wie folgt aus:Wie Schatten Python Builttin Pwd Modul

import pwd 
    ... 
    def func(): 
     user=pwd.getpwnam(user)[2] 

Jetzt haben wir einen besonderen Bedarf haben diesen Code mit Tests zu decken, und Tests haben sein runnable unter Windows. Das Programm selbst soll nur unter Linux laufen. Das Problem ist, dass das Modul pwd unter Windows nicht verfügbar ist, daher schlägt der getestete Code mit ImportError fehl, auch wenn die Implementierung von pwd-Funktionen mit MagicMock gespottet wird.

Die Grundidee, dieses Problem zu lösen, bestand darin, das pwd-Modul beim Ausführen von Tests zu spiegeln. Wenn also Tests ausgeführt werden, überschreibt der Stub pwd und wenn das Hauptprogramm ausgeführt wird, wird original (Unix) pwd verwendet. Wir haben solche Stummel bei Test PYTHONPATH:

# pwd.py 
def getpwnam(user): 
    print("YESSSSSSSS") 

Aber es scheint nicht zu einem PWD Modul beschatten, in einem Debugger wir sehen, dass die eingebaute in pwd importiert wird. Ich bin hauptsächlich ein Java-Entwickler, also tut es mir leid, wenn die Art, Dinge zu tun, nicht "pythonisch" ist. Ideen sind willkommen.

Antwort

9

Benennen Sie Ihre pwd.py in etwas anderes um, z. B. winpwd.py. Dann nutzen:

try: 
    import pwd 
except ImportError: 
    import winpwd as pwd 

Durch den Import pwd diese Weise werden Sie den eingebauten in pwd auf Linux und winpwd unter Windows erhalten. Dann sollten Sie in der Lage sein, Tests durchzuführen und es nach Belieben zu verspotten.

+0

Ausgezeichnete Antwort, genau das, was wir brauchen! – Dmitriusan

+0

wie soll man winpwd installieren? Pip hat es nicht indiziert, und eine Google-Suche findet seltsame Dinge. – syonip

+0

Ich habe das gleiche Problem. – Locane

4
import os 
if os.name == 'nt': 
    class Pwd(): 
     def getpwnam(self, user): 
      pass 
    pwd = Pwd() 
else: 
    import pwd 

Könnte etwas ähnliches funktionieren? Keine Notwendigkeit für zusätzliche .py-Dateien in Ihrem Projekt.
Ich habe es für fchown selbst ein paar Mal verwendet ...

+0

Das wird nicht wie geschrieben funktionieren. Jede Methode muss eine @ class method-Funktion sein. –

+0

Warum sollte das nicht funktionieren? Ich habe gerade eine Klasse erstellt, die Sie instanziieren können? Dort, repariert es? – Torxed

+2

Ihr bearbeiteter Code funktioniert, nicht Ihre vorherige Version. –