Tôi đang viết một ứng dụng Python lấy lệnh làm đối số, ví dụ:
$ python myapp.py command1
Tôi muốn ứng dụng có thể mở rộng, nghĩa là có thể thêm các mô-đun mới thực hiện các lệnh mới mà không phải thay đổi nguồn ứng dụng chính. Cây trông giống như:
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
Vì vậy, tôi muốn ứng dụng tìm các mô-đun lệnh có sẵn trong thời gian chạy và thực thi mô-đun thích hợp.
Python định nghĩa hàm __import__ , lấy một chuỗi cho tên mô-đun:
__import __ (tên, globalals = Không, địa phương = Không, fromlist = (), level = 0)
Hàm nhập tên mô-đun, có khả năng sử dụng các phần tử và địa phương đã cho để xác định cách diễn giải tên trong ngữ cảnh gói. Danh sách từ đưa ra tên của các đối tượng hoặc mô hình con nên được nhập từ mô-đun được cung cấp theo tên.
Nguồn: https://docs.python.org/3/l Library / fiances.html # import
Vì vậy, hiện tại tôi có một cái gì đó như:
command = sys.argv[1]
try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
# Display error message
command_module.run()
Điều này hoạt động tốt, tôi chỉ tự hỏi liệu có thể có một cách thành ngữ hơn để thực hiện những gì chúng ta đang làm với mã này.
Lưu ý rằng tôi đặc biệt không muốn sử dụng trứng hoặc điểm mở rộng. Đây không phải là một dự án nguồn mở và tôi không hy vọng sẽ có "plugin". Vấn đề là đơn giản hóa mã ứng dụng chính và loại bỏ sự cần thiết phải sửa đổi nó mỗi khi một mô-đun lệnh mới được thêm vào.
dir(__import__)
. Danh sách từ phải là một danh sách các tên để mô phỏng "từ nhập tên ...".
importlib
: stackoverflow.com/a/54956419/687896