2011-01-23 5 views
5

Nếu tôi có một thiết lập thư mục src như thế này:cơ bản Python nhập khẩu chất vấn

main.py 
pkg1: 
    __init__.py 
    util.py 
pkg2: 
    __init__.py 
    test.py 

Bạn có thể cho tôi biết cách tốt nhất để nhập khẩu pkg1.util từ main.py và từ test.py?

Cảm ơn! (Nếu tôi cần phải có một __init__.py tập tin trong thư mục gốc, cho tôi biết?)

Trả lời

5

Kể từ khi bạn đề cập đến rằng đây là Python 3, bạn không cần phải thêm phần sau vào các tệp .py của mình. Tôi sẽ vẫn mặc dù bởi vì nó giúp ngược di động nếu một số cỏ nghèo của những người bị mắc kẹt trên Python 2 nhu cầu sử dụng mã của bạn:

from __future__ import absolute_import 

Cho rằng bạn đang sử dụng Python 3, hoặc là bạn đang sử dụng Python 2 và đã bao gồm dòng ở trên, đây là câu trả lời của bạn:

từ main.py:

import pkg1.util as util 

từ test.py bạn sẽ sử dụng một trong hai cách tùy thuộc vào việc bạn coi pkg1pkg2 được những thứ sẽ luôn được triển khai cùng nhau theo cách tương tự liên quan đến nhau, hoặc liệu chúng sẽ luôn được triển khai từng bán độc lập ở cấp cao nhất. Nếu là người đầu tiên, bạn sẽ làm điều này:

from ..pkg1 import util 

và nếu đó là lựa chọn thứ hai, điều này:

import pkg1.util as util 

Điều này có nghĩa, tất nhiên, rằng bạn luôn chạy Python từ thư mục trong đó main.py hoặc thư mục đó nằm trong PYTHONPATH hoặc kết thúc bằng sys.path vì một số lý do (ví dụ như thư mục gói trang web Python chính).

+0

Nếu một 'pkg1' khác tồn tại vì một số lý do trong' PYPATH', tôi vẫn nhận được * this * 'pkg1' được nhập với cả hai tùy chọn này? –

+0

@aharon: Không có tùy chọn nào hứa hẹn với bạn rằng bạn sẽ nhận được 'pkg1' dự định mà không gây rối với' sys.path' để đảm bảo thư mục thích hợp là đầu tiên trong đường dẫn. Có xung đột tên gói theo cách này là một ý tưởng rất xấu, trừ khi bạn có một hệ thống quản lý gói như 'setuptools' quản lý gói như là một 'gói không gian tên'. – Omnifarious

+3

Sẽ không phải tất cả điều này yêu cầu '__init__py' trong cùng thư mục với' main.py'? Vì nó là, 'test.py' và' util.py' nằm trong các gói hoàn toàn riêng biệt mà không phải là gói con của một gói siêu phổ biến. –

1

Từ main.py:

import pkg1.util 

Từ test.py:

from ..pkg1 import util