2012-03-26 75 views
5

Tôi đang chạy Windows 7 và Windows 2.7 32 bit.Đối số dòng lệnh Python (Windows)

Tôi đang cố gắng viết một dòng lệnh Python script có thể chạy từ CMD. Tôi đang cố gắng gán một giá trị cho sys.argv [1]. Mục đích của kịch bản của tôi là tính toán giá trị băm MD5 của một tệp. Tệp này sẽ được nhập vào khi kịch bản lệnh được gọi trong dòng lệnh và do đó, sys.argv [1] sẽ đại diện cho tệp được băm.

Dưới đây là code của tôi dưới đây:

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 tôi chạy kịch bản này, tôi nhận được một lỗi:

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

Để gọi kịch bản của tôi, tôi đã viết "test.txt script.py " ví dụ. Cả tập lệnh và tệp nguồn đều nằm trong cùng một thư mục. Tôi đã thử nghiệm len (sys.argv) và nó chỉ trở lại như có chứa một giá trị, đó là tên kịch bản python.

Mọi đề xuất? Tôi chỉ có thể giả định đó là cách tôi gọi mã thông qua CMD

+0

Bạn có một tệp mở đang xử lý ở đó. Sử dụng 'với mở (filePath, 'rb') như fh:' thay thế. – wim

+1

xem http://stackoverflow.com/questions/2640971/windows-is-not-passing-command-line-arguments-to-python-programs-executed-from-t# để biết thêm thông tin – laike9m

Trả lời

2

cố gắng chạy tập lệnh bằng cách sử dụng python script.py test.txt, bạn có thể có liên kết bị hỏng của thông dịch viên với phần mở rộng .py.

+0

@fastreload, nó bị ràng buộc , nhưng chỉ tên kịch bản được truyền cho người phiên dịch, phần còn lại của các tham số bị bỏ qua, đó là một liên kết bị hỏng – newtover

+0

Cảm ơn. Dường như tôi đã thực sự có một hiệp hội bị hỏng. Tôi đã làm theo ví dụ bên dưới và đã xử lý: - http://www.voidspace.org.uk/python/articles/command_line.shtml – thefragileomen

8

Bạn nên kiểm tra xem trong registry của bạn theo cách bạn đã liên kết các tập tin là chính xác, ví dụ:

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

Cảm ơn bạn! Điều này làm việc như một sự quyến rũ đối với tôi. Tôi đã gãi đầu của tôi về lý do tại sao 'python' đã quên các đối số dòng lệnh cho các tập lệnh được khởi chạy từ' CMD.EXE' (mặc dù không phải từ trình bao Mingw32!). –

-2

Bạn đã thử sys.argv[0]? Nếu len(sys.argv) = 0 thì sys.argv[1] sẽ cố truy cập mục thứ hai và không tồn tại

2

Sự cố nằm trong sổ đăng ký. Gọi python script.py test.txt hoạt động, nhưng đây không phải là giải pháp. Đặc biệt nếu bạn quyết định thêm tập lệnh vào PATH và muốn sử dụng nó trong các thư mục khác.

Mở RegEdit và điều hướng đến HKEY_CLASSES_ROOT \ Applications \ python.exe \ shell \ open \ command. Nhấp chuột phải vào tên (Mặc định) và Sửa đổi. Nhập:

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

Nhấp OK, khởi động lại CMD và thử lại.

Các vấn đề liên quan