2015-04-29 35 views
6

Ho bisogno di nascondere la password quando l'utente esegue script in console (come questo: mysql -p). Per i parametri di input, utilizzo argparse, come posso aggiungere getpass alla password param?Come nascondere la password in python

parser = argparse.ArgumentParser() 
parser.add_argument('-p', action='store', dest='password', type=getpass.getpass()) 

Quando eseguo il mio script: python script.py -u User -p ricevo linea separata per inserire la password (Password:), ma dopo essere entrati Eccezione rilancio: ValueError: 'my_password' is not callable

+2

Si prega di inviare [esempio minimo, completo e verificabile] (http://stackoverflow.com/help/mcve) – Alik

+1

il suo comune per effettuare una chiamata a 'getpass' dopo che l'analisi di' argparse' è completa in modo che venga eseguita dopo gli argomenti della linea cmd sono stati verificati. – tdelaney

risposta

5

Questo ragazzo dovrebbe risolvere il problema: getpass

Ecco un esempio con un'azione personalizzata

class PwdAction(argparse.Action): 

    def __call__(self, parser, namespace, values, option_string=None): 
     mypass = getpass.getpass() 
     setattr(namespace, self.dest, mypass) 

parser = argparse.ArgumentParser() 
parser.add_argument('-f', action=PwdAction, nargs=0) 
+0

Io lo uso (tipo = getpass.getpass()) ma ho bisogno di usarlo insieme a argparse – oxana

+0

Cura da elaborare? OP sta già utilizzando il getpass. Un link ai documenti potrebbe essere utile ma non è davvero una risposta. – Holloway

+2

Scusa, non ho visto. Quindi vorrei creare un'azione personalizzata che richieda all'utente l'accesso con getpass, permettimi di modificare la risposta in un attimo! – qwattash

3

MODIFICA: La mia pre la risposta viziata era errata e basata su un'ipotesi. Questo è stato il mio tentativo di una soluzione di lavoro. @qwattash ha pubblicato la risposta correttamente, ma da quando ho impiegato dieci minuti a risolverlo ho pensato di correggere la mia risposta.

import argparse 
import getpass 

class Password(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string): 
     if values is None: 
      values = getpass.getpass() 
     setattr(namespace, self.dest, values) 

parser = argparse.ArgumentParser() 
parser.add_argument('-p', action=Password, nargs='?', dest='password') 
args = parser.parse_args() 

password = args.password #either from command line or from prompt 
+0

Ho provato, ma in questo caso prendo errore: errore: argomento -p: previsto un argomento. Almeno nella mia soluzione posso eseguire script e prendere la linea per inserire la password nascosta. – oxana

+0

@no_test, vedere risposta aggiornata (e qwattash). – Holloway

+0

Questa dovrebbe essere la risposta corretta. – Blairg23

-1

Risposta breve: No, non è possibile!

argparse modulo non è intenzione di farlo. Dovresti chiedere la password per altri processi separati. Inoltre, l'argomento type è solo un convertitore di valori utilizzato prima del salvataggio del valore.

Problemi correlati