2012-01-21 22 views
54

Tôi muốn nhập thư mục con làm mô-đun. Do đó mọi thư mục con chứa một số __init__.py. cấu trúc thư mục của tôi là như thế này:Mô-đun nhập từ thư mục con

src\ 
    main.py 
    dirFoo\ 
    __init__.py 
    foofactory.py 
    dirFoo1\ 
     __init__.py 
     foo1.py 
    dirFoo2\ 
     __init__.py 
     foo2.py 

Trong kịch bản chính của tôi, tôi nhập

from dirFoo.foofactory import FooFactory 

Trong tập nhà máy này tôi bao gồm các module phụ:

from dirFoo1.foo1 import Foo1 
from dirFoo2.foo2 import Foo2 

Nếu tôi gọi foofactory tôi gặp lỗi, con trăn đó không thể nhập các mô-đun con foo1 và foo2:

Traceback (most recent call last): 
    File "/Users/tmp/src/main.py", line 1, in <module> 
from dirFoo.foofactory import FooFactory 
    File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in <module> 
from dirFoo1.foo1 import Foo1 
    ImportError: No module named dirFoo1.foo1 

Trả lời

79

Không cần để gây rối với PYTHONPATH hoặc sys.path của bạn ở đây.

Để sử dụng đúng cách nhập khẩu tuyệt đối trong một gói phần mềm bạn nên bao gồm các "gốc" tên gói là tốt, ví dụ .:

from dirFoo.dirFoo1.foo1 import Foo1 
from dirFoo.dirFoo2.foo2 import Foo2 

Hoặc bạn có thể sử dụng relative imports:

from .dirfoo1.foo1 import Foo1 
from .dirfoo1.foo1 import Foo2 
+24

Một điều cần nhớ! thêm '__init __. py' vào mọi thư mục con mà bạn đang nhập từ đó. –

+3

Empty '__init __. Py' có thể thực hiện công việc. – cerebrou

+0

Cú pháp sẽ là gì nếu trước đây 'Foo1' nằm trong thư mục mẹ và một mã được mã hóa giống như' từ Foo1 import * '. Có cách nào để đạt được hiệu ứng tương tự như vậy bạn không cần phải tiền tố tất cả mọi thứ với 'Foo1'? – jxramos

3

Đặt biến môi trường PYTHONPATH của bạn. Ví dụ như PYTHONPATH =.: .. (cho gia đình * nix).

Ngoài ra bạn có thể thêm thư mục hiện tại của bạn (src trong trường hợp của bạn) để PYTHONPATH:

import os 
import sys 
sys.path.insert(0, os.getcwd()) 
4

Chỉ cần thông báo ở đây. (từ một newbee, keviv22)

Không bao giờ và vì lợi ích của chính bạn, hãy đặt tên cho các thư mục hoặc tập tin bằng dấu cách hoặc ký hiệu như "-" hoặc "_". Nếu bạn làm như vậy, bạn có thể gặp phải một số vấn đề. như của tôi, nói rằng, mặc dù lệnh nhập của bạn là chính xác, bạn sẽ không thể nhập thành công các tệp mong muốn có sẵn trong các thư mục có tên như vậy.

namings không hợp lệ thư mục như sau:

  • Generic-Lớp-Thư mục
  • Generic_Classes_Folder

namings thư mục có giá trị trên:

  • GenericClassesFolder hoặc Genericclassesfolder hoặc genericClassesFolder (hoặc như thế này mà không có bất kỳ không gian hoặc s những biểu tượng pecial giữa các từ)

sai lầm tôi đã làm gì:

xem xét các cấu trúc file.

Parent 
    . __init__.py 
    . Setup 
    .. __init__.py 
    .. Generic-Class-Folder 
     ... __init__.py 
     ... targetClass.py 
    . Check 
    .. __init__.py 
    .. testFile.py 

Tôi muốn làm gì?

  • từ testFile.py, tôi muốn nhập 'targetClass.tệp py 'bên trong tệp Chung-Lớp-Thư mục để sử dụng hàm có tên "functionExecute" trong tệp' targetClass.py '

Tôi đã làm lệnh gì?

  • từ 'testFile.py', viết lệnh, từ Core.Generic-Class-Folder.targetClass nhập khẩu functionExecute
  • Chấn lỗi như "Lỗi Cú pháp: cú pháp không hợp lệ"

Cố gắng nhiều tìm kiếm và xem nhiều câu hỏi về stackoverflow và không thể quyết định điều gì đã xảy ra. Tôi đã kiểm tra các tệp của mình nhiều lần, tôi đã sử dụng tệp __init__.py, đường dẫn môi trường được chèn vào và cực kỳ lo lắng điều gì đã xảy ra ......

Và sau một thời gian dài, tôi đã tìm ra điều này khi trò chuyện với một người bạn của tôi Tôi hơi ngu ngốc khi sử dụng các quy ước đặt tên như vậy. Tôi không bao giờ nên sử dụng dấu cách hoặc ký hiệu đặc biệt để xác định tên cho bất kỳ thư mục hoặc tệp nào. Vì vậy, đây là những gì tôi muốn truyền đạt. Chúc bạn ngày mới tốt lành!

(xin lỗi vì bài đăng lớn này ... chỉ để cho sự thất vọng của tôi đi .... :) Cảm ơn!)

+2

Dấu cách và dấu gạch ngang ("-") sẽ gây ra điều này, nhưng dấu gạch dưới ("_") vẫn hoạt động tốt. – cowlinator

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