2011-06-25 19 views
5

Tôi vô cùng tôi không thể tìm thấy câu trả lời đơn giản cho điều này trên internet, vì vậy có thể sẽ có một câu trả lời trong tương lai vì câu hỏi này!Trường hợp nào python tìm kiếm một dll được mở bởi ctypes.cdll. <name> trên cửa sổ?

Tôi đang sử dụng pywiiuse, một trình bao bọc python cho thư viện c wiiuse trên cửa sổ. Tôi đã nhận được một số ví dụ đơn giản C làm việc đơn giản bằng cách bao gồm dll, tiêu đề và thư viện trong thư mục của nguồn.

Tuy nhiên, tôi tự hỏi nơi để đặt dll để pywiiuse sẽ tìm thấy nó. Một cái nhìn tại nguồn cho thấy rằng nó được nạp như sau:

Ví dụ chạy tạo ra một mô-đun không tìm thấy ngoại lệ khi tôi có dll trong cùng một thư mục như ví dụ thử nghiệm của tôi.

Tìm python ở đâu?

+1

Tôi tin rằng nó tìm kiếm trong cùng một vị trí Windows sẽ tìm kiếm các tệp DLL - vì vậy trong thư mục của Python exe và trong Windows/System32. –

+0

Có tùy chọn nào tôi có thể chạy python để thay đổi điều này bằng bất kỳ cơ hội nào không? Tôi không ngại đặt nó vào đó nếu tôi phải làm, nhưng tôi muốn giữ nó trong thư mục làm việc. – cemulate

Trả lời

3

Windows DLL search order được ghi lại trên MSDN. Nó không phải là Python cụ thể, và không có cách nào để thay đổi thứ tự tìm kiếm từ một tùy chọn dòng lệnh. (. Nhưng xem các bài viết liên quan cho cách khác chi phối thứ tự tìm kiếm)

Nguồn để ctypes/__init__.py làm:

from _ctypes import LoadLibrary as _dlopen 

tôi đã không thể tìm ra định nghĩa về LoadLibrary trong _ctypes.c, nhưng có lẽ nó là một trình bao bọc cho chức năng Windows LoadLibraryEx hoạt động tương tự như chức năng POSIX dlopen, bởi vì đó là cách nó được sử dụng.

Nếu bạn có thể sửa đổi mã nguồn Python sử dụng constructor ctypes.CDLL thay vào đó, nó sẽ làm việc:

folder = os.path.dirname(os.path.abspath(__file__)) 
dll_path = os.path.join(folder, "wiiuse.dll")  
dll = ctypes.CDLL(dll_path) 

Nếu đó không phải là khả thi, bạn có thể ctypes khỉ vá để xử lý trường hợp cụ thể này , nhưng điều đó có vẻ hơi nguy hiểm. Có lẽ chỉ cần sao chép các DLL được trong cùng một thư mục với DLL Python sẽ là lựa chọn thay thế dễ nhất.

+1

Vì vậy, nó ra khỏi tay của python sau đó. Tôi chỉ nhớ rằng tệp của tôi không phải là tệp thực thi, python là tệp thực thi. Haha. – cemulate

0

tải một DLL tùy chỉnh trong một thư mục tùy chỉnh bằng cách sử dụng Windows API mất một vài bước sau:

  1. Xác nhận nơi họ đang sử dụng hệ thống tập tin gọi - một cái gì đó giống như một đống toàn bộ dòng tìm kiếm cái gì đó như: if path.exists(cwd() + "bin" + "mydll.dll"): return cwd() + "bin". Hoặc nếu bạn cảm thấy dũng cảm chỉ cần đặt con đường.
  2. Sử dụng ctypes để tải Kernel32.dll - nó biết vị trí đó là nguyên bản.
  3. Tải SetDllDirectory từ Kernel32.dll. Gọi nó với con đường mà bạn biết nơi dll của bạn được.
  4. Bây giờ LoadLibrary sẽ tìm kiếm các tệp trong thư mục đó, vì vậy bạn có thể sử dụng ctypes để tải dll của bạn và gọi hàm của bạn.
Các vấn đề liên quan