2012-03-26 20 views
5

Używam 32-bitowych systemów Windows 7 i Python 2.7.Argumenty wiersza poleceń w języku Python (Windows)

Próbuję napisać skrypt Python z linii poleceń, który może być uruchamiany z CMD. Próbuję przypisać wartość do sys.argv [1]. Celem mojego skryptu jest obliczenie wartości skrótu MD5 pliku. Ten plik zostanie wprowadzony po wywołaniu skryptu w wierszu poleceń, a więc sys.argv [1] powinien reprezentować plik, który ma zostać zaszyfrowany.

Oto mój kod poniżej:

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 uruchomić ten skrypt, otrzymuję błąd:

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

zadzwonić do mojego skryptu Pisałem „script.py test.txt " na przykład. Zarówno skrypt, jak i plik źródłowy znajdują się w tym samym katalogu. Przetestowałem len (sys.argv) i wraca on tylko jako zawierający jedną wartość, będącą nazwą skryptu Pythona.

Wszelkie sugestie? Mogę tylko założyć, że to jak wywołuję kod poprzez CMD

+0

Masz tam zwisający otwarty uchwyt pliku. Użyj 'with open (filePath, 'rb') jako fh:' zamiast tego. – wim

+1

zobacz http://stackoverflow.com/questions/2640971/windows-is-not-passing-command-line-arguments-to-python-programs-executed-from-t#, aby uzyskać więcej informacji – laike9m

Odpowiedz

2

spróbuj uruchomić skrypt przy użyciu python script.py test.txt, możesz mieć zerwane powiązanie interpretera z rozszerzeniem .py.

+0

@fastreload, jest związany , ale tylko nazwa skryptu jest przekazywana do interpretera, pozostałe parametry są pomijane, co jest zepsutym skojarzeniem. – newtover

+0

Dzięki. Wyglądało na to, że rzeczywiście mam zerwane powiązanie. Podążyłem za przykładem poniżej i zadziałało: - http://www.voidspace.org.uk/python/articles/command_line.shtml – thefragileomen

8

Należy sprawdzić, czy w rejestrze sposób masz związane plików jest poprawny, na przykład:

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

Dziękuję! To działało dla mnie jak urok. Drapałem się, dlaczego 'python' zapomniał argumentów wiersza poleceń dla skryptów uruchamianych z' CMD.EXE' (ale nie z powłoki Mingw32!). –

-2

Próbowałaś sys.argv[0]? Jeśli len(sys.argv) = 0, wówczas sys.argv[1] spróbuje uzyskać dostęp do drugiego i nieistniejącego elementu:

2

Problem jest w rejestrze. Dzwonię pod numer python script.py test.txt, ale to nie jest rozwiązanie. Zwłaszcza, jeśli zdecydujesz się dodać skrypt do swojej PATH i chcesz go użyć również w innych katalogach.

Otwórz RegEdit i przejdź do HKEY_CLASSES_ROOT \ Applications \ python.exe \ shell \ open \ command. Kliknij prawym przyciskiem myszy nazwę (Domyślne) i Modyfikuj. Wpisz:

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

Kliknij OK, zrestartuj CMD i spróbuj ponownie.

Powiązane problemy