Python命令行参数(Windows)

5

我正在使用32位的 Windows 7 和 Python 2.7。

我尝试编写一个可以在命令行中运行的Python脚本。我试图将一个值赋给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)

每次运行这个脚本时,我都会收到一个错误提示:
filename = sys.argv[1]
IndexError: list index out of range

要调用我的脚本,例如“script.py test.txt”,我已经写好了。脚本和源文件都在同一个目录中。我测试了len(sys.argv),但它只返回一个值,即Python脚本名称。
有什么建议吗?我只能假设是我通过CMD调用代码的方式不对。

你有一个悬空的打开文件句柄。请改用with open(filePath, 'rb') as fh: - wim
1
请参阅https://dev59.com/OHE85IYBdhLWcg3wvGAR以获取更多信息。 - laike9m
4个回答

8
您需要检查注册表中文件关联的方式是否正确,例如:
[HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"

谢谢!这对我来说非常有效。我一直在纳闷为什么 python 会忘记从 CMD.EXE 启动的脚本的命令行参数(尽管从 Mingw32 shell 启动则不会!)。 - Dan Lenski

3
问题出在注册表中。调用python script.py test.txt可以工作,但这不是解决办法,特别是如果您决定将脚本添加到PATH并想在其他目录中使用它。
打开RegEdit并导航到HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command。右键单击名称(默认)并修改。输入:
"C:\Python27\python.exe" "%1" %*

点击“确定”,重启CMD,然后再尝试一次。

2

尝试使用 python script.py test.txt 运行脚本,你可能会遇到解释器与 .py 扩展名的关联损坏的问题。


@fastreload,它已经绑定了,但是只有脚本名称被传递给解释器,其余的参数被跳过了,这是一个损坏的关联。 - newtover
谢谢。看来我的关联确实是损坏了。我按照下面的示例操作,它完美地解决了问题:-http://www.voidspace.org.uk/python/articles/command_line.shtml - thefragileomen

-3
你尝试过使用 sys.argv[0] 吗?如果 len(sys.argv) = 0,那么 sys.argv[1] 将会尝试访问第二个不存在的项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接