2011-02-03 35 views
11

Tôi đã tạo một dự án trong python và tôi tò mò về cách các gói hoạt động trong python.Dự án Python và bố trí thư mục gói

Đây là bố trí thư mục của tôi:

top-level dir 
    \ tests 
    __init__.py 
    \ examples 
    __init__.py 
    example.py 
module.py 

Làm thế nào tôi sẽ đi về bao gồm module.py trong mô-đun example.py tôi. Tôi biết tôi có thể đặt PYTHONPATH vào thư mục cấp cao nhất, nhưng điều đó dường như không phải là một giải pháp tốt. Đây là cách pydev được xung quanh vấn đề này, nhưng tôi muốn một giải pháp mà không yêu cầu cập nhật các biến môi trường.

tôi có thể đặt một cái gì đó ở phía trên cùng của example.py để cập nhật sys.path như thế này:

from os import path 
import sys 

sys.path.append(path.dirname(path.abspath(path.dirname(__file__)))) 

Tôi không nghĩ rằng đây là một giải pháp thích hợp một trong hai.

Tôi cảm thấy mình thiếu một số phần cơ bản của gói python. Tôi đang thử nghiệm này trên python 2.6. Nếu cần làm rõ thêm, vui lòng cho tôi biết.

+0

http://jcalderone.livejournal.com/39794.html –

Trả lời

8

gói Python là rất đơn giản: một gói là bất kỳ thư mục dưới bất kỳ mục trong sys.path rằng có một tập tin __init__.py. Tuy nhiên, một mô-đun chỉ được coi là IN trong gói nếu nó được nhập thông qua một lần nhập tương đối như import package.module hoặc from package import module. Lưu ý rằng điều này có nghĩa là nói chung, ai đó phải thiết lập sys.path để chứa các thư mục ở trên bất kỳ gói nào bạn muốn nhập, cho dù qua PYTHONPATH hoặc cách khác.

Các nếp nhăn chính là các mô-đun chính (các mô-đun chạy trực tiếp từ dòng lệnh) luôn là __main__ bất kể vị trí của chúng. Do đó, họ phải thực hiện nhập khẩu tuyệt đối và dựa vào PYTHONPATH đang được thiết lập hoặc tự mình thực hiện sys.path.

Trong trường hợp của bạn, tôi khuyên bạn nên có một tập lệnh Python nhỏ chạy các ví dụ của bạn sau khi thiết lập đường dẫn chính xác. Giả sử bạn đặt nó vào thư mục cấp cao nhất:

#!/usr/bin/env python 
import sys 
import os.path 

sys.path.append(os.path.dirname(__file__)) 
example = __import__("examples", globals(), locals(), sys.argv[1]) 

Sau đó, ví dụ của bạn có thể làm "mô-đun nhập".

Cách khác, nếu module.py có nghĩa là cũng nằm trong gói, hãy thêm PARENT của "thư mục cấp cao nhất" của bạn vào sys.path và sau đó sử dụng cú pháp from .. import module trong mô-đun ví dụ của bạn. Ngoài ra, thay đổi tham số đầu tiên thành __import__ trong trình bao bọc thành "tldname.examples" trong đó tldname là tên của thư mục cấp cao nhất của bạn.

Nếu bạn không muốn dựa vào mô-đun "ví dụ Á hậu", mỗi ví dụ cần sys.path boilerplate hoặc bạn cần cài đặt PYTHONPATH. Lấy làm tiếc.

+0

Các mô-đun chính được xử lý đặc biệt, mà không bao gồm bất kỳ mô-đun khác là gợi ý cho phép tôi để móng tay này trong một cách di động, tốt đẹp.Trong phương pháp chính hiện nay, chúng tôi liên tục thêm thư mục hàng đầu của dự án địa phương của chúng tôi để sys.path và mọi thứ khác hoạt động chính xác như mong đợi. –

1
+0

Sau khi thử điều đó, tôi nhận được lỗi sau: ValueError: Đã cố gắng nhập tương đối không gói. Tôi có một '__init __. Py' trong thư mục ví dụ và thư mục cha. – Joe

+0

Nếu bạn không làm việc trong một gói, thì có, bạn nên thiết lập PYTHONPATH. – Amber

+0

Tôi đang làm việc trong một gói mặc dù. Tôi có '__init __. Py' trong cả thư mục cấp cao nhất và thư mục ví dụ. – Joe

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