Python tự động tải các mô-đun trong thư mục

Mã Python được tổ chức trong các thư mục được gọi là các gói chứa các tệp .py có tên là modules. Trong bài viết này, tôi trình bày một thủ thuật để tự động nhập trong gói cấp cao nhất tất cả các lớp được định nghĩa trong các mô hình con. Điều này rút ngắn các câu lệnh nhập để thuận tiện cho người dùng cuối. cụ thể là

from package_name import ClassName

thay vì

from package_name.module_name import ClassName

Vấn đề ở đây là gì?

Tôi cần điều này trong khi tạo trình tạo blog tĩnh của mình. Trình tạo được tổ chức dưới dạng một đường dẫn chuyển đổi lấy các tệp đánh dấu làm đầu vào và tạo một blog html làm đầu ra. Hơi giống với kiến ​​trúc dựa trên plugin, tôi quyết định triển khai từng bước của quy trình trong tệp riêng. Cấu trúc của dự án như sau

calepin ├── pipeline.py ├── processors    ├── __init__.py    ├── processor_1.py    ├── ...    └── processor_50.py

Và bên trong from package_name.module_name import ClassName 0, mục tiêu là viết

đường dẫn. py ______4_______

Hoặc thậm chí

đường dẫn. py ______5_______

Thay vì

đường dẫn. py ______6_______

Tất nhiên, trong một dự án python điển hình, tôi sẽ phản đối việc sử dụng from package_name.module_name import ClassName 1. Nhưng đối với dự án máy phát điện của tôi, mẫu thiết kế rất rõ ràng. xác định một quy trình, thực hiện tất cả các bước của nó trong gói phụ from package_name.module_name import ClassName 2. Vì vậy, khá an toàn để from package_name.module_name import ClassName 1 tất cả các bước

Có một số cách để đạt được điều này trong python. Chẳng hạn, tôi có thể đã sử dụng móc nhập trong tệp from package_name.module_name import ClassName 0. Nhưng tôi chọn sử dụng gói con from package_name.module_name import ClassName 5 để nhập động tất cả các lớp có trong các mô hình con của nó. Đây là cách

Tự động nhập tất cả các lớp trong gói

Mã được xây dựng dựa trên các tài nguyên này

Đặt cái này vào from package_name.module_name import ClassName 6 và bạn đã sẵn sàng để đi

bộ xử lý/__init__. py ______13_______

Trình tải cho kiến ​​trúc plugin

Nhân tiện, một cách hay để tải tất cả các plugin trong một thư mục là để chúng mở rộng lớp cơ sở from package_name.module_name import ClassName 7, sau đó tải động các lớp con của nó

Cách Pythonic nhất để nhập mô-đun từ một thư mục khác là đặt một tệp trống có tên __init__.py vào thư mục đó và sử dụng đường dẫn tương đối với ký hiệu dấu chấm

Ví dụ: một mô-đun trong thư mục mẹ sẽ được nhập bằng from . import module. Tệp __init__.py báo hiệu cho Python rằng thư mục phải được coi là gói

Xây dựng vấn đề

Vấn đề. Làm cách nào để nhập tệp hoặc mô-đun từ một thư mục hoặc thư mục khác trong Python?

Thí dụ. Giả sử, bạn đã đưa ra cấu trúc thư mục sau

application ├── app │ └── folder │ └── file_1.py └── app2 └── some_folder └── file_2.py

Mục tiêu của bạn là nhập các hàm từ file_1.py trong # file_2.py import sys sys.path.append('/.../application/app/folder') import file_10

Phương pháp 1. hệ thống. đường dẫn. nối thêm ()

Phương pháp đầu tiên nối thêm đường dẫn của ____________ vào biến ___16_______2 của hệ thống

# file_2.py import sys sys.path.append('/.../application/app/folder') import file_1

Lưu ý rằng bạn cần thay thế ba dấu chấm đầu tiên trong # file_2.py import sys sys.path.append('/.../application/app/folder') import file_13 bằng đường dẫn cụ thể đến thư mục # file_2.py import sys sys.path.append('/.../application/app/folder') import file_14

Nhân tiện, vui lòng tham gia học viện email miễn phí của tôi và tải xuống bảng gian lận Python của bạn tại đây

Thật thú vị–và hàng nghìn Finxter đã nói với tôi rằng họ thích các cheat sheet

Được rồi, hãy chuyển sang một giải pháp sửa đổi một chút cho vấn đề này

Phương pháp 2. hệ thống. đường dẫn. chèn()

Một cách thay thế tương tự là chèn đường dẫn của file_1.py vào vị trí 1 của biến # file_2.py import sys sys.path.append('/.../application/app/folder') import file_12 của hệ thống

Điều này đảm bảo rằng nó được tải với mức độ ưu tiên cao hơn và tránh một số xung đột khi đặt tên

# file_2.py import sys sys.path.insert(1, '/.../application/app/folder') import file

Một lần nữa, thay thế ba dấu chấm đầu tiên trong # file_2.py import sys sys.path.append('/.../application/app/folder') import file_13 bằng đường dẫn cụ thể đến thư mục # file_2.py import sys sys.path.append('/.../application/app/folder') import file_14

Phương pháp 3. Ký hiệu dấu chấm với __init__. py

Bạn cũng có thể thực hiện thủ thuật sau—tạo một gói mới

# file_2.py from application.app.folder.file_1 import func_name

Tuy nhiên, đảm bảo bao gồm một tệp __init__.py trống trong thư mục

Tệp này báo cho Python coi thư mục là một gói. Tôi coi đây là cách Pythonic nhất để giải quyết vấn đề này

Phương pháp 4. nhập khẩu

Một giải pháp thay thế không quá Pythonic - phức tạp hơn và dựa trên các phụ thuộc bên ngoài - sẽ là sử dụng mô-đun # file_2.py import sys sys.path.insert(1, '/.../application/app/folder') import file0

Đây là một ví dụ

import importlib.util as ilu folder = '/.../application/app/folder' file = 'file_2' spec = ilu.spec_from_file_location(file, folder) your_lib = ilu.module_from_spec(spec) spec.loader.exec_module(your_lib) your_lib.function()

Video liên quan

Vui lòng xem video giải thích sau đây, trong đó Peter, Người sáng tạo Finxter, chỉ cho bạn cách gọi một hàm từ một tệp khác

Làm cách nào để gọi một hàm từ một tệp khác trong Python?


Xem video này trên YouTube

Người giới thiệu

  • https. // stackoverflow. com/câu hỏi/4383571/nhập-tệp-từ-thư mục khác nhau
  • https. // stackoverflow. com/questions/67631/how-to-import-a-module-given-the-full-path?rq=1
  • Cách nhập hàm Python từ thư mục khác

Đi đâu từ đây?

Đủ lý thuyết. Hãy thực hành một số

Các lập trình viên được trả sáu con số trở lên vì họ có thể giải quyết vấn đề hiệu quả hơn bằng cách sử dụng trí thông minh máy móc và tự động hóa

Để trở nên thành công hơn trong việc viết mã, hãy giải quyết nhiều vấn đề thực tế hơn cho người thực. Đó là cách bạn trau dồi những kỹ năng bạn thực sự cần trong thực tế. Rốt cuộc, việc sử dụng lý thuyết học tập mà không ai cần là gì?

Bạn xây dựng các kỹ năng mã hóa có giá trị cao bằng cách làm việc trên các dự án mã hóa thực tế

Bạn có muốn ngừng học với các dự án đồ chơi và tập trung vào các dự án mã thực tế giúp bạn kiếm tiền và giải quyết các vấn đề thực sự cho mọi người không?

🚀 Nếu câu trả lời của bạn là CÓ. , cân nhắc trở thành nhà phát triển Python tự do. Đó là cách tốt nhất để tiếp cận nhiệm vụ cải thiện kỹ năng Python của bạn—ngay cả khi bạn là người mới hoàn toàn

Nếu bạn chỉ muốn tìm hiểu về cơ hội làm việc tự do, vui lòng xem hội thảo trên web miễn phí của tôi “Cách xây dựng kỹ năng Python có thu nhập cao của bạn” và tìm hiểu cách tôi phát triển công việc viết mã của mình trực tuyến cũng như cách bạn có thể làm được—từ sự thoải mái của bạn

Tham gia hội thảo trên web miễn phí ngay bây giờ

Các hướng dẫn khác về Finxter

Học tập là một quá trình liên tục và bạn nên khôn ngoan để không bao giờ ngừng học hỏi và cải thiện trong suốt cuộc đời mình. 👑

Học gì?

Tôi khuyên bạn nên đọc ít nhất một hướng dẫn mỗi ngày (chỉ 5 phút cho mỗi hướng dẫn là đủ) để đảm bảo rằng bạn không ngừng học hỏi

💡 Nếu bạn muốn chắc chắn rằng mình không quên thói quen của mình, vui lòng tham gia học viện email miễn phí của chúng tôi để nhận các hướng dẫn mới hàng tuần và lời nhắc học tập trong INBOX của bạn

Ngoài ra, hãy lướt qua danh sách hướng dẫn sau đây và mở 3 hướng dẫn thú vị trong tab trình duyệt mới để bắt đầu thói quen học tập mới — hoặc tiếp tục với thói quen học tập hiện tại — của bạn ngay hôm nay. 🚀

Khái niệm cơ bản về Python

  • Python Một dòng cho Vòng lặp
  • Nhập mô-đun từ thư mục khác
  • Xác định loại đối tượng Python
  • Chuyển đổi danh sách chuỗi thành danh sách int
  • Chuyển đổi danh sách Int thành danh sách chuỗi
  • Chuyển đổi danh sách chuỗi thành danh sách nổi
  • Chuyển đổi danh sách thành mảng NumPy
  • Nối dữ liệu vào tệp JSON
  • Danh sách lọc Python
  • Danh sách lồng nhau

Quản lý phụ thuộc Python

  • Cài đặt PIP
  • Cách kiểm tra phiên bản Python của bạn
  • Kiểm tra phiên bản Pandas trong Script
  • Kiểm tra phiên bản Python Jupyter
  • Kiểm tra phiên bản gói PIP

Gỡ lỗi Python

  • Bắt và in ngoại lệ
  • Danh sách chỉ số vượt khỏi phạm vi
  • Sửa Giá trị Lỗi Sự thật
  • Không thể nhập tên X Lỗi

Nội dung thú vị

  • 5 Cheat Sheet Mỗi Python Coder cần sở hữu
  • 10 câu đố Python hay nhất để khám phá trình độ kỹ năng thực sự của bạn
  • Cách kiếm 1000 đô la từ bên lề với tư cách là một Freelancer Python

Cảm ơn bạn đã học với Finxter

lập trình viên

Q: How do you tell an introverted computer scientist from an extroverted computer scientist? A: An extroverted computer scientist looks at your shoes when he talks to you.

Chris

Trong khi làm việc với tư cách là một nhà nghiên cứu trong các hệ thống phân tán, Dr. Christian Mayer tìm thấy tình yêu của mình với việc dạy sinh viên khoa học máy tính

Để giúp sinh viên đạt được mức độ thành công Python cao hơn, anh ấy đã thành lập trang web giáo dục lập trình Finxter. com. Ông là tác giả của cuốn sách lập trình nổi tiếng Python One-Liners (NoStarch 2020), đồng tác giả của loạt sách tự xuất bản Coffee Break Python, người đam mê khoa học máy tính, cộng tác viên tự do và chủ sở hữu của một trong 10 blog Python lớn nhất thế giới

Niềm đam mê của anh ấy là viết, đọc và mã hóa. Nhưng niềm đam mê lớn nhất của anh ấy là phục vụ các lập trình viên đầy tham vọng thông qua Finxter và giúp họ nâng cao kỹ năng của mình. Bạn có thể tham gia học viện email miễn phí của anh ấy tại đây

Tôi có thể tải động một mô-đun bằng Python không?

Phương thức nhập mô-đun(moduleName) từ gói importlib có thể được sử dụng để nhập động các mô-đun Python .

Làm cách nào để nhập mô-đun có đường dẫn trong Python?

Có nhiều phương pháp khác nhau có thể được sử dụng để nhập mô-đun bằng cách sử dụng đường dẫn đầy đủ của mô-đun. .
sử dụng sys. đường dẫn. chức năng nối thêm ()
Sử dụng gói importlib
Sử dụng lớp SourceFileLoader

Cách chính xác để tải một mô-đun trong Python là gì?

Trong Python, các mô-đun được truy cập bằng cách sử dụng câu lệnh nhập .

Nhập chậm trong Python là gì?

“Lười biếng” có nghĩa là việc nhập mô-đun (thực thi phần thân mô-đun và thêm đối tượng mô-đun vào sys. modules ) sẽ không xảy ra cho đến khi mô-đun (hoặc tên được nhập từ nó) thực sự được tham chiếu trong quá trình thực thi

Chủ đề