2014-11-10 27 views
15

Tôi đã có một dự án mà tôi muốn sử dụng một số lớp python nằm trong các thư mục khác.Nhập khẩu Python đường dẫn tương đối

Ví dụ cấu trúc:

/dir 
+../subdirA 
+../subdirB 
+../mydir 

Đường dẫn tuyệt đối khác nhau, vì dự án này được chạy trên các máy khác nhau.

Khi file python của tôi với MySampleClass nằm ở /mydir được thực thi, làm thế nào để nhập khẩu OtherClassRoot nằm ở /dir hoặc OtherClassA nằm ở /subdirA?

tôi đã cố gắng những thứ như:

from . import MySampleClass as msc 

hoặc

from ../ import MySampleClass as msc 

nhưng điều này luôn luôn thất bại hay mang lại cho tôi thông báo lỗi như nhập khẩu tương đối Cố gắng trong phi gói

Vì vậy, whats đúng cách để tương đối nhập khẩu các tập tin python?

Bất kỳ đầu vào được đánh giá cao :)

+1

Bạn đã đọc phần [Gói] (https://docs.python.org/2/tutorial/modules.html#packages) trong tài liệu Python chưa? Bạn cũng có thể tìm thấy mã ví dụ mà tôi đăng trong [câu trả lời này] (http://stackoverflow.com/a/26623508/4014959) hữu ích. –

Trả lời

18

Bạn sẽ cần một __init__.py trong thư mục mydir (và nó có thể để trống), sau đó càng lâu càng dir là trong đường dẫn sys, giả sử MySampleClass của bạn là trong myfile. py và myfile.py là trong mydir

from mydir.myfile import MySampleClass 

Nếu bạn muốn nhập chức năng cấp cao nhất từ ​​một tập tin gọi util.py đó cư trú tại subdirA vào myfile.py (nơi lớp học của bạn là), sau đó một __init__.py phải trong subdirA và sau đó trong myfile.py

from subdirA.util import somefunc, someotherfunc 

Điều tương tự cũng đúng với đường dẫn của sys, nghĩa là bạn phải bắt đầu từ 'dir' hoặc thêm nó. Mọi thứ được nhập từ cấp cao nhất của gói (thường là thư mục dự án của bạn).

Tuy nhiên, để kiểm tra mô-đun, nơi bạn có thể chạy hàm từ util trong trình thông dịch, nếu bạn bắt đầu từ subdirA, bạn sẽ cần thêm thư mục vào đường dẫn của sys, vì vậy việc nhập của bạn có thể giải quyết.

>>> import sys 
>>> sys.path.append('../dir') 

nhưng đây là một hack và sẽ thích hợp hơn khi chỉ sử dụng từ thông dịch viên khi bạn đang thử nghiệm. Bạn cũng có thể thêm 'dir' vào các gói trang web của bạn trong tệp pth.

Để sử dụng nhập tương đối, bạn sẽ cần một thư mục lồng nhau sâu hơn, như subdirA/subdirofA, sau đó trong subdirofA, bạn có thể sử dụng. quay trở lại (như from .subdirB). Thực sự, đối với tôi, nhập khẩu tương đối có phần khó nhìn thấy tiện ích. Tôi nên sử dụng nhập trực tiếp liên quan đến thư mục dự án, nhưng tôi có thể thấy chúng hữu ích nếu bạn muốn lồng một gói con ngây thơ, nhưng một lần nữa, tốt hơn là rõ ràng hơn là ẩn nếu có thể.

cũng thấy this

+0

Tôi đoán bạn đã cho tôi sai (hoặc tôi giải thích nó xấu^^): * MySampleClass * nằm trong * mydir * và được thi hành. Vì vậy, tôi muốn nhập một số lớp người khác từ * subdirA *, * subdirB *, ... vào * MySampleClass * (nằm trong * myfile.py * trong */mydir *) – daniel451

-2

Về cơ cấu dir như sau:

/dir 
+../subdirA 
+../subdirB 
+../mydir 

kết hợp với lệnh linux ln, chúng ta có thể làm cho mọi việc đơn giản hơn rất nhiều:

1. cd dir/mydir 
2. ln -s ../subdirA ./ 
3. ln -s ../subdirB ./ 

Và, bây giờ nếu bạn muốn nhập some_stuff từ tệp: dir/subdirA/fileA.py vào tệp của bạn: dir/mydir/myfile.py, chỉ cần im cổng như thế này:

from subdirA.fileA import some_stuff 

Và, cùng áp dụng cho 'dir/subdirB'

gì hơn, điều này làm việc cho setup.py quá trình, :)

+1

chúng ta đều biết rất nhiều thủ thuật có thể được thực hiện để có được công việc này xung quanh, ví dụ: '../', '__init __. py', chúng tốt nhưng không đủ đơn giản, đây là cách duy trì và đơn giản nhất mà tôi tìm thấy cho đến nay, mong đợi các độ phân giải tốt hơn và đơn giản hơn! – jacoolee

2

đầu tiên thêm các đường dẫn tương đối so với PYTHONPATH

import os 

import sys 

cwd = os.getcwd() 

sys.path.append(cwd + '/../subdirA/') 

sys.path.append(cwd + '/../subdirB/') 

sau đó nhập mô-đun.

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