2010-10-30 38 views
5

Tôi đang viết một applet python để thu thập dữ liệu từ các công cụ khoa học và tôi đang cố gắng tìm ra cách tốt nhất để quản lý các trình điều khiển thiết bị của mình.Việc tải các mô-đun bị trì hoãn trong python

Mỗi trình điều khiển được đại diện bởi một mô-đun python riêng biệt trong gói đó là chương trình của tôi. Họ từng thực hiện một số giao diện tiêu chuẩn, nhưng chủ yếu nó là một danh sách khổng lồ của các lệnh (và ánh xạ chức năng) được cụ thể cho từng thiết bị và xe buýt tham gia. Về lâu dài, (tôi đang viết điều này cho nhóm phòng thí nghiệm của mình và đang lên kế hoạch hỗ trợ vài chục thiết bị) Tôi muốn tránh tải tất cả chúng cùng một lúc. Thay vào đó, tại thời gian chạy, tôi muốn đọc trong một danh sách các mô-đun vào một từ điển/danh sách và sau đó tải chúng chỉ khi chúng thực sự cần thiết.

Khi người dùng muốn sử dụng thiết bị mới, anh chọn trình điều khiển để sử dụng và chuyển tên cùng với hệ thống phụ trình điều khiển để kiểm tra xem trình điều khiển đó có nằm trong danh sách các mô-đun đã tải hay không , nó gọi hàm __import__ và nạp trình điều khiển sau đó khởi tạo một đối tượng thiết bị bằng trình điều khiển và đưa nó trở lại người dùng để sử dụng.

Câu hỏi của tôi là: Cách tốt nhất để có danh sách tất cả các mô-đun theo cách tương đối là gì? Những gì tôi có nghĩa là, nếu tôi biết rằng các trình điều khiển được đặt tại ..drivers là có một cách để có được một danh sách các mô-đun gọn gàng trong subpacakage? Để minh họa: thông thường tôi chỉ gọi from ..drivers import driver_name để nhập mô-đun, nhưng vì tôi không được bảo đảm là trong thư mục gói, không thể chỉ chúng tôi os để có danh sách tên mô-đun.

Trong mọi trường hợp, bất kỳ ý tưởng nào (thậm chí có thể là cách tốt hơn để hoàn thành những gì tôi muốn - trình điều khiển "có thể nạp") sẽ được đánh giá cao.

Trả lời

3

Nếu vị trí của gói trình điều khiển được biết, thì bạn có thể sử dụng đường dẫn tuyệt đối đến (các) thư mục trình điều khiển.

Tôi nghĩ rằng một cách tiếp cận mạnh mẽ hơn là có danh sách tất cả các trình điều khiển đã biết cho chương trình của bạn, có lẽ cùng với một chút siêu dữ liệu để người dùng có thể chọn chúng dễ dàng hơn. Bạn có thể có các trình điều khiển đăng ký chính mình, hoặc đăng ký cho mình nếu bạn biết các địa điểm có khả năng. Một ưu điểm của việc các trình điều khiển tự đăng ký là bạn có thể có các tệp python ngoài các trình điều khiển trong các thư mục gói trình điều khiển.

Sửa

Đối với một người lái xe để "tự đăng ký", bạn có thể làm điều gì đó như thế này:

if __name__ == "__main__": 
    import mamapackage 
    mamapackage.register("thisdriver", 
       os.path.abspath(__file__), 
       "A description of this driver") 

Sau đó, trong gói riêng của bạn, cung cấp một "đăng ký" chức năng cập nhật danh sách của các trình điều khiển, với vị trí và mô tả của họ (một tệp văn bản đơn giản nên làm cho người mới bắt đầu).

+0

Làm cách nào để tôi có trình điều khiển tự đăng ký? Thực hiện chúng với các kịch bản nhỏ để tìm phần mềm của tôi và tự đăng ký? hoặc một cái gì đó thông minh hơn? – crasic

+0

Cảm ơn vì đề xuất tuyệt vời, tôi triển khai một tệp văn bản đơn giản để giữ tên trình điều khiển và siêu dữ liệu, có thể không phải là giải pháp dài hạn tốt nhất (khi mọi người có thể muốn nhập trình điều khiển bên ngoài), nhưng chắc chắn hoạt động như một sự quyến rũ trong thời gian này. – crasic

3

pkgutiliter_modules. (Lưu ý: The Python 2 documentation không đề cập đến chức năng đó, nhưng nó hoạt động tốt cho tôi trên Python 2.6.)

Bạn cũng có thể thực hiện thủ công bằng cách sử dụng __file__, os.pathos.listdir.

0

Tại sao không tạo một gói của tất cả các trình điều khiển? Sau đó, bạn có thể

import drivers 
drivers.load("device1") 

nơi chức năng ánh xạ tên thiết bị thành mô-đun trong gói?Sau đó, bạn có thể nhập động từng mô-đun được yêu cầu khi cần thiết ...

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