2013-05-31 32 views
10

Dir cấu trúc:Python: làm thế nào để nhập khẩu từ tất cả các mô-đun trong thư mục?

main.py 
my_modules/ 
    module1.py 
    module2.py 

module1.py:

class fooBar(): 
    .... 
class pew_pew_FooBarr() 
    .... 
... 

Làm thế nào tôi có thể thêm tất cả các lớp từ mô-đun * to main mà không tiền tố (tức là sử dụng chúng như foo = foobar(), không foo = my_modules.module1.fooBar()).

Một quyết định rõ ràng là viết trong main.py một cái gì đó như thế này:

from my_modules.module1 import * 
from my_modules.module2 import * 
from my_modules.module3 import * 
... 

Nhưng tôi không muốn thay đổi main.py khi tôi tạo mới moduleN. Có giải pháp cho điều đó không?

Tôi biết không nên nhập các lớp như thế này, nhưng tôi vẫn tò mò về điều đó.

UPD: Câu hỏi này khác với câu hỏi này Loading all modules in a folder in Python, bởi vì sự cố của tôi là tải mô-đun mà không có không gian tên.

+1

Bạn có nghĩa là nhập mô-đun động trong python http://stackoverflow.com/questions/301134/dynamic-module-import-in-python? – rahul

+0

Nhập mô-đun động là giải pháp khá phức tạp cho điều này, tôi nghĩ vậy. – ov7a

Trả lời

27

Trong thư mục my_modules, hãy thêm tệp __init__.py để đặt gói đó thành gói thích hợp. Trong tệp đó, bạn có thể tiêm các hình cầu của mỗi mô-đun trong phạm vi toàn cục của tệp __init__.py, làm cho chúng có sẵn khi mô-đun của bạn được nhập (sau khi bạn đã thêm tên toàn cục vào biến số __all__):

__all__ = [] 

import pkgutil 
import inspect 

for loader, name, is_pkg in pkgutil.walk_packages(__path__): 
    module = loader.find_module(name).load_module(name) 

    for name, value in inspect.getmembers(module): 
     if name.startswith('__'): 
      continue 

     globals()[name] = value 
     __all__.append(name) 

Bây giờ, thay vì thực hiện:

from my_modules.class1 import Stuff 

Bạn chỉ có thể làm:

from my_modules import Stuff 

Hoặc nhập tất cả mọi thứ vào glob al phạm vi, mà dường như là những gì bạn muốn làm:

from my_modules import * 

Vấn đề với phương pháp này là các lớp học ghi đè lên nhau, vì vậy nếu hai mô-đun cung cấp Foo, bạn sẽ chỉ có thể sử dụng một trong đó là nhập khẩu cuối cùng.

+0

Tuyệt vời! Điều đó làm việc cho tôi. – ov7a

+0

có thể mã trên đi vào tập tin __init__.py hoặc nó nên đi đâu đó khác để tự động nhập các mô-đun. – nish

+0

Chính xác những gì tôi muốn. Tuy nhiên, 'find_module' không còn được dùng kể từ 3.3. – VPfB

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