2013-08-16 38 views
14

Tôi có gói hello1 chứa mô-đun good.py.Có thể truy cập các biến trong __init__.py từ các mô-đun trong cùng một gói không?

hello1 
├── __init__.py 
└── good.py 

Module init có một biến A = 1, và tôi cần phải truy cập vào hello1.A biến trong good.py.

import hello1 

class Good(object): 
    def __init__(self): 
     print hello1.A 

if __name__ == "__main__": 
    g = Good() 

Vấn đề là khi tôi thực thi tập lệnh python, tôi gặp lỗi ImportError: 'No module named hello1'. Tôi có thể thêm import sys; sys.path.append("..") tại dòng đầu tiên của good.py để khắc phục nhanh chóng.

Tuy nhiên, good.py nằm trong gói hello1 trong đó __init__.py cũng có trong đó, vì vậy tôi tự hỏi liệu có cách nào để truy cập các biến trong __init__.py từ các mô-đun trong cùng một gói hay không.

+1

Bạn đã thử truy cập thư mục chứa 'hello1' và chạy tập lệnh với' python hello1 \ good.py' chưa?Ngoài ra, bạn có thể tìm thấy câu trả lời ở đây: http://stackoverflow.com/questions/436497/python-import-the-containing-package – flornquake

Trả lời

6

Từ Python: import the containing package:

Nhập __init__ dường như làm việc tốt.

import __init__ 

class Good(object): 
    def __init__(self): 
     print hello1.A 
+5

Bạn không nên nhập trực tiếp '__init__'. Thay vào đó, thư mục cha của 'hello1' sẽ được liệt kê trong đường dẫn tìm kiếm mô-đun python và' hello1' nên được nhập vào thay thế. –

+0

Nếu bạn sử dụng 'python -m hello1.good' thay vào đó, thì thư mục làm việc hiện tại sẽ được thêm vào đường dẫn tự động; nếu đó là thư mục cha của 'hello1' mọi thứ hoạt động tốt. –

+0

@MartijnPieters, Không phải lúc nào. Nếu bạn có một tệp thực thi nằm bên trong gói và nói rằng tệp thực thi muốn tìm kiếm số phiên bản của gói nằm trong __init__.py, đây chính xác là những gì bạn nên làm. – Cerin

0

Nếu bạn không thích sys.path.append (...) bạn có thể chạy kịch bản của bạn như

python -m hello1.good 

trong thư mục chứa các "hello1" -directory hoặc sử dụng các biến môi trường PYTHONPATH thay của sys.path.

1

Nếu tôi không nhầm bạn muốn làm một cái gì đó như:

python hello1/good.py 

Kể từ good.py là một submodule của một gói bạn shouldn, 't chạy nó trực tiếp; hãy nhớ rằng khi trực tiếp thực hiện nó, nó không được coi là một phần của gói hello1, ngăn chặn việc nhập tương đối và thư mục hiện tại là thư mục chứa tệp, do đó không thể tìm thấy hello1 nếu nó không phải là một phần của số PYTHONPATH. Thay vào đó bạn có thể chạy nó bằng cách sử dụng -m tắc của thông dịch viên python:

-m mod: chạy mô-đun thư viện như một kịch bản (kết thúc danh sách tùy chọn)

Cá nhân tôi không thích sử dụng các tùy chọn phiên dịch thực thi một tệp python. Tôi muốn có một tệp trình khởi chạy độc lập good.py nhập khẩu mô-đun hello1.good và sử dụng nó để làm những gì nó phải làm.

0

Bạn phải nhập rõ ràng các hằng số bạn muốn sử dụng.

Nên sử dụng tất cả các hằng số của bạn trong tệp "config" (ví dụ: config.py)) và sau đó nếu bạn muốn chúng trong không gian tên gói, hãy nhập chúng.

init tập tin py:

from package.config import * 

thì rõ ràng hơn theo cách đó