5

I am running 32-bit Windows 7 and Python 2.7.

I am trying to write a command line Python script that can run from CMD. I am trying to assign a value to sys.argv[1]. The aim of my script is to calculate the MD5 hash value of a file. This file will be inputted when the script is invoked in the command line and so, sys.argv[1] should represent the file to be hashed.

Here's my code below:

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 I run this script, I receive an error:

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

To call my script, I have been writing "script.py test.txt" for example. Both the script and the source file are in the same directory. I have tested len(sys.argv) and it only comes back as containing one value, that being the python script name.

Any suggestions? I can only assume it is how I am invoking the code through CMD

thefragileomen
  • 1,537
  • 8
  • 24
  • 40
  • You have a dangling open file handle there. Use `with open(filePath, 'rb') as fh:` instead. – wim Mar 27 '12 at 00:11
  • 1
    see http://stackoverflow.com/questions/2640971/windows-is-not-passing-command-line-arguments-to-python-programs-executed-from-t# for more info – laike9m Dec 13 '13 at 17:06

4 Answers4

8

You should check that in your registry the way you have associated the files is correct, for example:

[HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"
mandel
  • 2,921
  • 3
  • 23
  • 27
  • Thank you! This worked like a charm for me. I was scratching my head about why `python` was forgetting the command-line arguments for scripts launched from `CMD.EXE` (though not from the Mingw32 shell!). – Dan Lenski Oct 28 '14 at 17:18
3

The problem is in the registry. Calling python script.py test.txt works, but this is not the solution. Specially if you decide to add the script to your PATH and want to use it inside other directories as well.

Open RegEdit and navigate to HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command. Right click on name (Default) and Modify. Enter:

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

Click OK, restart your CMD and try again.

kerma
  • 2,593
  • 2
  • 17
  • 16
2

try to run the script using python script.py test.txt, you might have a broken association of the interpreter with the .py extention.

newtover
  • 31,286
  • 11
  • 84
  • 89
  • @fastreload, it is bound, but only the script name is passed to the interpreter, the rest of the parameters are skipped, which is a broken association – newtover Mar 26 '12 at 22:25
  • Thanks. It seemed I did indeed have a broken association. I followed the example below and it worked a treat:- http://www.voidspace.org.uk/python/articles/command_line.shtml – thefragileomen Mar 27 '12 at 19:35
-3

Did you try sys.argv[0]? If len(sys.argv) = 0 then sys.argv[1] would try to access the second and nonexistent item

Zsolt Botykai
  • 50,406
  • 14
  • 85
  • 110
bomber8013
  • 15
  • 1