2015-06-19 12 views
5

Tôi đang gặp khó khăn trong việc đọc khóa đăng ký được tạo bởi phần mềm của tôi. Tuy nhiên với cùng một mã, tôi có thể đọc các phím khác.winreg.OpenKey ném lỗi filenotfound cho các khóa registry hiện tại

installdir = winreg.OpenKey(
          winreg.HKEY_LOCAL_MACHINE, 
          "SOFTWARE\\Microsoft\\MediaPlayer\\Player\\Extensions\\Types" 
          ) #this works perfect 
#installdir1 = winreg.OpenKey(
           winreg.HKEY_LOCAL_MACHINE, 
          "SOFTWARE\\MySoftware\\MyEvent\\IS" 
          ) #this gives Filenotfound error 

# list values owned by this registry key 
try: 
    i = 0 
    while 1: 
     name, value, type = winreg.EnumValue(installdir, i) 
     print (repr(name)) 
     i += 1 
except WindowsError: 
    print ("Bot donf") 
value, type = winreg.QueryValueEx(installdir, "10") 
print("user is", repr(value)) 

value, type = winreg.QueryValueEx(winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS"), "v2") 
print("user is", repr(value)) 

Traceback lãm

Traceback (most recent call last): 
    File "D:/python_scripts/myclass.py", line 32, in <module> 
    value, type = winreg.QueryValueEx(winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS"), "v2") 
    FileNotFoundError: [WinError 2] The system cannot find the file specified 

Tuy nhiên Windows truy vấn reg có thể lấy các thiết lập giá trị.

#reg query HKLM\SOFTWARE\MySoftware\MyEvent\IS /v v2 

HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware\MyEvent\IS 
v2 REG_DWORD 0x12 

Bất kỳ trợ giúp sẽ được đánh giá cao

+0

đã chỉnh sửa lỗi đánh máy trong câu lệnh truy vấn trả lời. Nhưng đó không phải là một vấn đề anyways – Debianeese

Trả lời

6

Có 2 quan điểm của registry. Có chế độ xem đăng ký 32 bit và chế độ xem đăng ký 64 bit. Theo mặc định và trong hầu hết các trường hợp, các ứng dụng 32 bit sẽ chỉ nhìn thấy khung nhìn đăng ký 32 bit và các ứng dụng 64 bit sẽ chỉ nhìn thấy khung nhìn đăng ký 64 bit.

Chế độ xem khác có thể được truy cập bằng cách sử dụng cờ truy cập KEY_WOW64_64KEY hoặc KEY_WOW64_32KEY.

Nếu bạn đang chạy 32-bit python và chìa khóa của bạn là một phần của quan điểm đăng ký 64-bit, bạn nên sử dụng một cái gì đó như thế này để mở chìa khóa của bạn:

winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | winreg.KEY_WOW64_64KEY) 

Nếu bạn đang chạy 64-bit python và chìa khóa của bạn là một phần của quan điểm đăng ký 32-bit, bạn nên sử dụng một cái gì đó như thế này để mở chìa khóa của bạn:

winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | winreg.KEY_WOW64_32KEY) 

Nếu bạn biết phím luôn là một phần của quan điểm tương tự, thêm KEY_WOW64_* truy cập thích hợp cờ sẽ đảm bảo rằng nó hoạt động không có vấn đề gì kiến ​​trúc python của bạn e là.

Trong trường hợp chung nhất, nếu bạn có kiến ​​trúc python biến và bạn không biết trước trong đó xem phím sẽ được, bạn có thể thử tìm chìa khóa theo quan điểm hiện tại của bạn và thử xem khác tiếp theo. Nó có thể trông giống như sau:

try: 
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS") 
except FileNotFoundError: 
    import platform 

    bitness = platform.architecture()[0] 
    if bitness == '32bit': 
     other_view_flag = winreg.KEY_WOW64_64KEY 
    elif bitness == '64bit': 
     other_view_flag = winreg.KEY_WOW64_32KEY 

    try: 
     key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | other_view_flag) 
    except FileNotFoundError: 
     ''' 
     We really could not find the key in both views. 
     ''' 

Để biết thêm thông tin, hãy xem Accessing an Alternate Registry View.

+0

Điều này làm việc hoàn toàn cho tôi. – SirJames

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