2012-07-13 9 views
5

Tôi đang thử nghiệm với python, chủ yếu là khắc phục sự cố mã của người khác. Tôi đang cố gắng để có được một chương trình để chạy, "path\folderA\program.py".Không nhập khẩu python từ một thư mục khác

Tôi đang chạy chương trình từ path\folderA

Tôi nhận được một lỗi:

ImportError: No module named fff.ggg.ppp 

program.py chứa một nhập khẩu:

from fff.ggg.ppp import mmm 

Trong thư mục "path \ folderB" có: "path\folderB\fff\__init__.py" "path\folderB\fff\ggg"

thư mục ggg cũng chứa __init__.py, cũng như chương trình ppp.py

Từ đọc bài viết khác, như Python error "ImportError: No module named" Tôi hiểu rằng có __init__.py tạo ra một thư mục một "gói" mà làm cho hàng nhập khẩu từ nó có thể - nhưng nó doesn' làm việc, kể từ khi tôi nhận được một lỗi.

Điều này đã hoạt động đối với những người khác đã làm việc với các dự án này, vì vậy có sự cố với thiết lập của tôi.

Tôi đã đọc điều gì đó về các thư mục phải nằm trong sys.path. Điều đó có nghĩa là tôi phải thêm chúng vào đường dẫn biến môi trường? Điều đó có nghĩa là thêm rất nhiều thư mục vào PATH mặc dù, do đó, nó không thể được.

Vì vậy, tôi cũng thấy như sau:

import sys 
sys.path.append(<path to FolderB>) 

Nhưng điều đó có nghĩa là thay đổi mã (mà vẫn chưa cần thiết cho những người khác) và hard-coding một đường dẫn đến những gì nó là trên máy tính địa phương của tôi - mà Tôi không nên, phải không?

Tôi không thể hình dung được - dường như tôi không phải thay đổi mã và mã cứng đường dẫn vật lý vào mô-đun nhập - vậy làm cách nào để chương trình từ thư mục có thể biết tìm trong thư mục B để nhập?

Phép thuật __init__.py hoạt động như thế nào?

+1

Python tìm biến môi trường 'PYTHONPATH', không phải' PATH' – mgilson

Trả lời

1

I can't visualize it - apparently I am not supposed to change the code and hard-code the physical path to the import module - so how can a program from folderA even know to look in folderB for an import ?

Bạn là chính xác. Bằng cách nào đó bạn phải nói với python để tìm kiếm các mô-đun đã nhập trong thư mụcB. Không có ma thuật __init__.py cho phép bạn nhập từ các thư mục khác trên ổ cứng của mình.

Thông thường, nếu bạn có nhiều gói python khác nhau như vậy, chúng hoạt động bằng cách được cài đặt vào thư viện của python. Bằng cách đó, họ có thể nhập từ bất cứ đâu. Điều này thường được thực hiện bởi tập lệnh setup.py. Kiểm tra xem folderB có một hay không.Chạy nó với python setup.py install.

Nếu điều đó không hiệu quả, chúng tôi sẽ cần thêm thông tin về cách mã này được cấu trúc.

+0

Cảm ơn bạn, tôi đã thấy setup.py nhưng không biết cách sử dụng nó. Nó đã làm việc ! – Thalia

0

Thư mục B phải nằm trên sys.path, vì vậy bạn cần di chuyển mmm sang A hoặc sửa sys.path từ bên trong A (không chắc chắn nếu nó hoạt động). __init__.py cho python biết rằng thư mục là một gói, vì vậy bạn có thể có thư mục với __init__.py trong các thư mục có __init__.py và python xử lý các thư mục bên trong như một phần của thư mục mẹ. Kiểm tra sympy hoặc gần như bất kỳ thư viện python lớn và bạn sẽ tìm thấy một cấu trúc như vậy. Nó cũng có thể chứa mã để chạy khi nhập, nhưng cũng có thể để trống.