2013-05-13 14 views
5

C'è del codice Python che funziona sotto Linux. Esso utilizza il modulo pwd in un modo simile:Come shadow python builtin pwd module

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

Ora abbiamo un bisogno specifico per coprire questo codice con i test e le prove devono essere eseguibile in ambiente Windows. Il programma stesso è destinato a funzionare solo su Linux. Il problema è che il modulo pwd non è disponibile in Windows, quindi il codice in prova fallirà con ImportError, anche se l'implementazione delle funzioni pwd viene derisa usando MagicMock.

L'idea di base per risolvere questo problema era quella di ombreggiare il modulo pwd durante l'esecuzione dei test. Quindi, durante l'esecuzione dei test, lo stub ombreggia pwd e durante l'esecuzione del programma principale, verrà utilizzato il pwd originale (Unix). Abbiamo creato tale stub a prova di PYTHONPATH:

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

Ma non sembra ombra di un modulo pwd, in un debugger vediamo che il built-in pwd è importato. Sono principalmente uno sviluppatore Java, quindi mi dispiace se il modo di fare le cose non è "pythonic". Le idee sono ben accette

risposta

9

Rinomina il tuo pwd.py in qualcos'altro, ad esempio winpwd.py. Quindi utilizzare:

try: 
    import pwd 
except ImportError: 
    import winpwd as pwd 

Importando pwd in questo modo, si otterrà il built-in pwd su Linux, e winpwd su Windows. Quindi dovresti essere in grado di eseguire test e deriderlo come ti pare.

+0

Risposta eccellente, proprio quello di cui abbiamo bisogno! – Dmitriusan

+0

come dovresti installare winpwd? pip non ha indicizzato, e una ricerca su google trova cose strane. – syonip

+0

Sto avendo lo stesso problema. – Locane

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

Potrebbe qualcosa di simile funzionare? Non c'è bisogno di file .py extra all'interno del progetto.
L'ho usato io stesso per fchown un paio di volte ...

+0

Che non funzionerà come scritto. Ogni metodo dovrà essere una funzione decorata @classmethod. –

+0

Perché non dovrebbe funzionare? Ho appena creato una classe che puoi installare? Lì, risolto? – Torxed

+2

Il codice modificato funzionerà, non la versione precedente. –