2012-03-26 123 views
5

我正在運行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

回答

2

嘗試使用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

8

你應該檢查你的註冊表你有關的文件的方式是正確的,例如:

[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

-2

你嘗試sys.argv[0]?如果len(sys.argv) = 0然後sys.argv[1]將嘗試訪問第二個和不存在的項目

2

問題是在註冊表中。調用python script.py test.txt的作品,但這不是解決方案。特別是如果您決定將腳本添加到您的PATH並且想要在其他目錄中使用它。

打開RegEdit並導航到HKEY_CLASSES_ROOT \ Applications \ python.exe \ shell \ open \ command。右鍵單擊名稱(默認)和修改。輸入:

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

單擊確定,重新啓動您的CMD並重試。