2012-03-26 22 views
5

Sono in esecuzione Windows 7 a 32 bit e Python 2.7.Argomenti della riga di comando Python (Windows)

Sto provando a scrivere uno script Python da riga di comando che può essere eseguito da CMD. Sto cercando di assegnare un valore a sys.argv [1]. Lo scopo del mio script è calcolare il valore hash MD5 di un file. Questo file verrà immesso quando lo script viene richiamato nella riga di comando e quindi sys.argv [1] dovrebbe rappresentare il file da sottoporre a hash.

Ecco il mio codice qui sotto:

import sys 
import hashlib 

filename = sys.argv[1] 

def md5Checksum(filePath): 
    fh = open(filePath, 'rb') 
    m = hashlib.md5() 
    while True: 
     data = fh.read(8192) 
     if not data: 
      break 
     m.update(data) 
    return m.hexdigest() 

# print len(sys.argv) 
print 'The MD5 checksum of text.txt is', md5Checksum(filename) 

Whenver ho eseguito questo script, ricevo un errore:

filename = sys.argv[1] 
IndexError: list index out of range 

Per chiamare il mio script, ho scritto "test.txt script.py " per esempio. Sia lo script che il file sorgente si trovano nella stessa directory. Ho testato len (sys.argv) e ritorna solo come contenente un valore, che è il nome dello script python.

Qualche suggerimento? Posso solo supporre che sia come sto invocando il codice tramite CMD

+0

Hai un handle di file aperto penzolante lì. Usa 'con open (filePath, 'rb') come fh:' invece. – wim

+1

vedere http://stackoverflow.com/questions/2640971/windows-is-not-passing-command-line-arguments-to-python-programs-executed-from-t# per ulteriori informazioni – laike9m

risposta

2

prova a eseguire lo script utilizzando python script.py test.txt, potresti avere un'associazione interrotta dell'interprete con l'estensione .py.

+0

@fastreload, è legato , ma solo il nome dello script viene passato all'interprete, il resto dei parametri viene saltato, che è un'associazione interrotta – newtover

+0

Grazie. Sembrava davvero che avessi un'associazione distrutta. Ho seguito l'esempio qui sotto e ha funzionato a meraviglia: - http://www.voidspace.org.uk/python/articles/command_line.shtml – thefragileomen

8

Si dovrebbe controllare che nel Registro di sistema il modo in cui è stato associato il file è corretto, ad esempio:

[HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command] 
@="\"C:\\Python27\\python.exe\" \"%1\" %*" 
+0

Grazie! Questo ha funzionato come un fascino per me. Mi stavo grattando sul fatto che 'python' stava dimenticando gli argomenti della riga di comando per gli script lanciati da' CMD.EXE' (sebbene non dalla shell Mingw32!). –

-2

Hai provato sys.argv[0]? Se len(sys.argv) = 0 allora sys.argv[1] proverebbero ad accedere al secondo elemento e inesistente

2

Il problema è nel Registro di sistema. Chiamare python script.py test.txt funziona, ma questa non è la soluzione. Specialmente se si decide di aggiungere lo script al PATH e si desidera utilizzarlo anche in altre directory.

Aprire RegEdit e passare a HKEY_CLASSES_ROOT \ Applications \ python.exe \ shell \ open \ command. Fare clic con il tasto destro sul nome (predefinito) e modificare. Immettere:

"C:\Python27\python.exe" "%1" %* 

Fare clic su OK, riavviare il CMD e riprovare.

Problemi correlati