2012-03-26 9 views
5

Ich bin mit 32-Bit-Windows 7 und Python 2.7.Python Befehlszeilenargumente (Windows)

Ich versuche, ein Kommandozeilen-Python-Skript zu schreiben, die von CMD ausführen können. Ich versuche, sys.argv [1] einen Wert zuzuweisen. Das Ziel meines Skripts ist es, den MD5-Hash-Wert einer Datei zu berechnen. Diese Datei wird eingegeben werden, wenn das Skript in der Kommandozeile aufgerufen wird, und so, sys.argv [1] sollte die Datei darstellt gehasht werden.

meinen Code unten hier:

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 ich dieses Skript ausführen, ich einen Fehler erhalten:

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

mein Skript zu nennen, ich habe geschrieben „script.py test.txt " beispielsweise. Sowohl das Skript als auch die Quelldatei befinden sich im selben Verzeichnis. Ich habe len (sys.argv) getestet und es kommt nur zurück, wenn es einen Wert enthält, der der Name des Python-Skripts ist.

Irgendwelche Vorschläge? Ich kann nur davon ausgehen, dass ich den Code über CMD

+0

Sie haben eine baumelnde geöffnete Datei dort behandeln. Verwenden Sie 'mit open (filePath, 'rb') als fh:' stattdessen. – wim

+1

siehe http://stackoverflow.com/questions/2640971/windows-is-not-passing-command-line-arguments-to-python-programs-executed-from-t# für weitere Informationen – laike9m

Antwort

2

versuche, das Skript unter Verwendung python script.py test.txt auszuführen, möglicherweise eine unterbrochene Verbindung des Interpreters mit der Erweiterung .py.

+0

@fastreload, es ist gebunden , aber nur der Name des Skriptes an den Interpreter übergeben wird, der Rest der Parameter übersprungen, die ein gebrochener Verein – newtover

+0

Dank ist. Es schien, dass ich tatsächlich eine gebrochene Verbindung hatte. Ich folgte dem Beispiel unten und es funktionierte ein Leckerbissen: - http://www.voidspace.org.uk/python/articles/command_line.shtml – thefragileomen

8

Sie sollten, dass in Ihrer Registrierung überprüfen, wie Sie die Dateien zugeordnet haben, ist richtig, zum Beispiel:

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

Danke! Das hat mir sehr gut gefallen. Ich habe mir überlegt, warum 'python' die Befehlszeilenargumente für Skripte vergaß, die von' CMD.EXE' gestartet wurden (allerdings nicht von der Mingw32-Shell!). –

-2

Haben Sie versucht, sys.argv[0]? Wenn len(sys.argv) = 0 dann sys.argv[1] versuchen würde, auf das zweite und nicht vorhandene Element zuzugreifen

2

Das Problem liegt in der Registrierung. Rufen Sie python script.py test.txt funktioniert, aber das ist nicht die Lösung. Vor allem, wenn Sie das Skript zu Ihrem PATH hinzufügen und es auch in anderen Verzeichnissen verwenden möchten.

Öffnen Sie Regedit und navigieren Sie zu HKEY_CLASSES_ROOT \ Applications \ python.exe \ \ open \ command shell. Klicken Sie mit der rechten Maustaste auf Name (Standard) und Ändern. Geben Sie ein:

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

Klicken Sie auf OK, starten Sie Ihre CMD neu und versuchen Sie es erneut.

Verwandte Themen