Python命令行参数(Windows)

问题描述:

我正在运行32位Windows 7和Python 2.7。Python命令行参数(Windows)

我想写一个命令行Python脚本,可以从CMD运行。我正在尝试为sys.argv指定一个值[1]。我的脚本的目的是计算文件的MD5哈希值。当脚本在命令行中被调用时,这个文件将被输入,所以sys.argv [1]应该表示要被散列的文件。

这里是我下面的代码:

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我运行此脚本,我收到一个错误:

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

把我的脚本,我一直在写“script.py的test.txt “ 例如。脚本和源文件都在同一个目录中。我已经测试了len(sys.argv),它只是回到包含一个值,即python脚本名称。

有什么建议吗?我只能假设这是我通过CMD调用代码的方式。

+0

你有一个悬空的打开文件句柄。使用'打开(filePath,'rb')作为fh:'代替。 – wim 2012-03-27 00:11:43

+1

请参阅http://stackoverflow.com/questions/2640971/windows-is-not-passing-command-line-arguments-to-python-programs-executed-from-t#了解更多信息 – laike9m 2013-12-13 17:06:05

尝试使用python script.py test.txt运行脚本,您可能会将解释器与.py扩展的关联关联起来。

+0

@fastreload,它是绑定的,但只有脚本名称被传递给解释器,其余的参数被跳过,这是一个破坏的关联 – newtover 2012-03-26 22:25:40

+0

谢谢。看起来我确实有一个破裂的关联。我遵循下面的例子,它的工作原理: - http://www.voidspace.org.uk/python/articles/command_line.shtml – thefragileomen 2012-03-27 19:35:18

你应该检查你的注册表你有关的文件的方式是正确的,例如:

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

谢谢!这对我来说就像一个魅力。我在摸索着为什么'python'忘记了从'CMD.EXE'启动的脚本的命令行参数(尽管不是来自Mingw32 shell!)。 – 2014-10-28 17:18:08

你尝试sys.argv[0]?如果len(sys.argv) = 0然后sys.argv[1]将尝试访问第二个和不存在的项目

问题是在注册表中。调用python script.py test.txt的作品,但这不是解决方案。特别是如果您决定将脚本添加到您的PATH并且想要在其他目录中使用它。

打开RegEdit并导航到HKEY_CLASSES_ROOT \ Applications \ python.exe \ shell \ open \ command。右键单击名称(默认)和修改。输入:

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

单击确定,重新启动您的CMD并重试。