2009-12-21 63 views
15

Tôi tải một dll trong python sử dụng đoạn mã sau:WindowsError: [Lỗi 126] Các module chỉ định không thể tìm thấy

if os.path.exists(dll_path): 
    my_dll = ctypes.cdll.LoadLibrary(dll_path) 

Nhưng tôi liên tục nhận được lỗi sau

WindowsError: [ Lỗi 126] Mô-đun được chỉ định không thể tìm thấy

dll có tại đường dẫn đã chỉ định, nhưng tôi không hiểu tại sao tôi gặp lỗi.

+0

Bạn có thể xây dựng trên DLL mà bạn đang cố gắng nhập và những gì mà DLL không? Nó có thể tự nó đang cố gắng để tải một DLL mà nó không thể tìm thấy. – santosc

+0

Câu trả lời cho [câu hỏi này] (http://stackoverflow.com/questions/2334627/error-loading-dll-in-path-with-parenthesis-using-ctypes-python) đã giải quyết nó cho tôi - trùng lặp? – Junuxx

Trả lời

12

Khi tôi nhìn thấy những thứ như thế này - nó thường là bởi vì có những dấu xồ nguợc trong đường dẫn được chuyển đổi.

Ví dụ: phần sau sẽ không thành công - vì \ t trong chuỗi được chuyển thành ký tự TAB.

>>> import ctypes 
>>> ctypes.windll.LoadLibrary("c:\tools\depends\depends.dll") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "c:\tools\python271\lib\ctypes\__init__.py", line 431, in LoadLibrary 
    return self._dlltype(name) 
    File "c:\tools\python271\lib\ctypes\__init__.py", line 353, in __init__ 
    self._handle = _dlopen(self._name, mode) 
WindowsError: [Error 126] The specified module could not be found 

Có 3 giải pháp (nếu đó là vấn đề)

a) Sử dụng dấu gạch chéo kép ...

>>> import ctypes 
>>> ctypes.windll.LoadLibrary("c:\\tools\\depends\\depends.dll") 

b) sử dụng dấu gạch chéo

>>> import ctypes 
>>> ctypes.windll.LoadLibrary("c:/tools/depends/depends.dll") 

c) sử dụng chuỗi RAW (mở đầu chuỗi bằng r

>>> import ctypes 
>>> ctypes.windll.LoadLibrary(r"c:\tools\depends\depends.dll") 

Trong khi tác phẩm thứ ba này hoạt động - thỉnh thoảng tôi có ấn tượng rằng nó không được coi là 'chính xác' bởi vì chuỗi RAW có nghĩa là cho cụm từ thông dụng. Tôi đã sử dụng nó cho các đường dẫn trên Windows trong Python trong nhiều năm mà không có vấn đề :))

-3

Kiểm tra tên dll của bạn .. nó không được chứa bất kỳ ký tự hoa .. nó phải có toàn bộ chữ thường để biên dịch thành công

+0

Đó là không chính xác a) của Windows Paths không phân nhạy cảm b) ngay cả khi sử dụng ctypes.windll.dll_name - bạn vẫn có thể sử dụng trường hợp hỗn hợp: '>>> ctypes.windll.UseR32.MessageBoxA' '<_FuncPtr đối tượng tại 0x01DEA648> ' – markm

0

Ngoài ra điều này có thể là bạn đã quên đặt thư mục làm việc của bạn trong nhật thực thành địa phương chính xác cho ứng dụng chạy.

14

Lưu ý rằng ngay cả khi DLL nằm trong đường dẫn của bạn. Nếu DLL đó dựa vào các DLL khác KHÔNG ở trong đường dẫn của bạn, bạn có thể gặp lỗi tương tự. Windows không thể tìm thấy sự phụ thuộc trong trường hợp này. Windows không thực sự tốt khi nói với bạn những gì nó không thể tìm thấy, chỉ rằng nó không tìm thấy cái gì đó. Đó là vào bạn để con số đó ra. Đường dẫn tìm kiếm dll Windows có thể được tìm thấy tại đây: http://msdn.microsoft.com/en-us/library/7d83bc18.aspx

Trong trường hợp của tôi, chắc chắn tất cả các tệp cần thiết đều nằm trong cùng một thư mục và thực hiện một thư mục os.chdir() đã giải quyết được sự cố.

+3

Chỉ cần đề cập đến" os.chdir() "(trong khi tôi không chắc đây có phải là cách xử lý vấn đề chính xác không) đã giúp tôi sau khi thử các tùy chọn được đề cập trong câu trả lời được đánh dấu – JavierQQ23

+0

os.chdir() là để đảm bảo thư mục với các dll nằm trong đường dẫn của bạn. Dù bằng cách nào cho phép Windows tìm thấy các dll –

1

Tôi đã gặp vấn đề tương tự trong Win10 32bit OS. Tôi giải quyết vấn đề bằng cách thay đổi DLL từ gỡ lỗi để phát hành phiên bản.

Tôi nghĩ rằng đó là vì phiên bản gỡ lỗi DLL phụ thuộc vào DLL khác, và phiên bản phát hành thì không.

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