2009-01-21 30 views
11

Về cơ bản, tôi hỏi cùng một câu hỏi với tên này: How to do relative imports in Python?Python - Thực hiện nhập khẩu tuyệt đối từ một thư mục con

Nhưng không ai trả lời đúng. Cho rằng bạn đang ở trong một thư mục con và bạn muốn đi lên một thư mục và sau đó vào thư mục con KHÁC, làm những gì họ đề nghị không hoạt động (như OP chỉ ra trong ý kiến ​​của mình để câu trả lời của họ).

Tôi biết rằng bạn có thể thực hiện việc này bằng cách sử dụng sys.path, nhưng tôi thích phương pháp dọn dẹp hơn.

Ví dụ:

App 
__init__.py 
Package_A 
--__init__.py 
--Module_A.py 
Package_B 
--__init__.py 
--Module_B.py 

Làm thế nào tôi sẽ nhập khẩu Module_A vào Module_B?

+0

Bởi "Module_A", bạn có nghĩa là "Package_A" không? Một gói có chứa một "__init__.py và, có thể, các mô-đun bổ sung. Bạn có thể viết lại" Module_A "của bạn và" Module_B "là" Package_A "và" Package_B "để câu hỏi của bạn rõ ràng hơn không? –

Trả lời

10
main.py 
setup.py 
app/ -> 
    __init__.py 
    package_a/ -> 
     __init__.py 
     module_a.py 
    package_b/ -> 
     __init__.py 
     module_b.py 
  1. Bạn chạy python main.py.
  2. main.py làm: import app.package_a.module_a
  3. module_a.py không import app.package_b.module_b

Ngoài 2 hoặc 3 có thể sử dụng: from app.package_a import module_a

Điều đó sẽ làm việc như miễn là bạn có app ở PYTHONPATH của bạn. main.py có thể ở bất cứ nơi nào sau đó.

Vì vậy, bạn viết setup.py để sao chép (cài đặt) toàn bộ gói ứng dụng và gói con vào thư mục python của hệ thống đích và main.py để nhắm mục tiêu thư mục tập lệnh của hệ thống.

+0

Điều chính là thêm các tệp '__init __. Py' thích hợp vào mỗi thư mục và bao gồm' ứng dụng' trong câu lệnh nhập của bạn. Nếu bạn làm điều đó, thêm dòng 'import app.package_a.module_a' vào' module_b.py' sẽ làm việc nhập thích hợp. Về cơ bản, bước 3 là những gì bạn muốn, phần còn lại là không liên quan trừ khi bạn đang lập kế hoạch phân phối gói. –

2

Nếu tôi readingcorrectly, bằng Python 2.5 trở lên:

from ..Module_B import Module_B 

Tôi nghĩ rằng tôi đã thành thạo trong Python nhưng tôi không hề biết đó là có thể trong phiên bản 2.5.

+0

Đúng vậy. Đó là một chút xấu xí mặc dù, và nhập khẩu tuyệt đối thường là điều tốt nhất ngoại trừ trong trường hợp đặc biệt – bobince

+2

Điều này không làm việc tôi nhận được "cố gắng nhập khẩu tương đối trong không gói" – ryeguy

+0

Tuyên bố được giả định là bên trong Module_A.py (và, sau chỉnh sửa, phải từ ..Package_B.) nhập khẩu tương đối được dựa trên đường dẫn gói của mô-đun bạn đang ở bên trong, không phải thư mục; bạn không thể sử dụng chúng từ tập lệnh cấp cao nhất hoặc mô-đun đơn giản. – bobince

0

Nếu bạn đang sau đó nhập khẩu Module_B trong App, bạn sẽ

Module_B.py: nhập khẩu ModuleA

App.py (mà cũng nhập khẩu ModuleA mà bây giờ là theo mặc định trong PYTHONPATH của bạn)

import Module_B.Module_B 

một lựa chọn khác, là để cập nhật __init__.py (một trong folder Module_A/App) tới:

import os 
import sys 
sys.path.extend('%s../' % os.getcwd()) 
import ModuleA 

Một cách khác, là thêm thư mục của bạn vào môi trường PYTHONPATH var.

+0

Sửa đổi 'sys.path' trong thời gian chạy gần như luôn luôn sai. Đó là mong manh và chỉ ra một gói cấu trúc kém. – habnabit

+0

Tôi chắc chắn đồng ý. –

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