Tôi có mã python trong một thư mục có tên là "project", vì vậy các tệp mã của tôi nằm trong project/*. Py. Tôi muốn có các mô-đun con trong đó, ví dụ:tổ chức mô-đun pythonic - cách tham chiếu đến các tệp trong thư mục gốc?
project/code.py # where code lives
project/mymodule1 # where more code lives
project/mymodule2
mỗi thư mục module có riêng init tập tin py của nó, ví dụ
project/mymodule1/__init__.py
giả sử tôi có tệp "test.py" trong mymodule1 (project/mymodule1/test.py) và tôi muốn tham khảo một điều gì đó từ "mã", ví dụ: nhập hàm "myfunc"
== project/mymodule1/test.py ==
from code import myfunc
vấn đề là "mã" sẽ không được tìm thấy trừ khi người dùng đã đặt thư mục "project /" trong PYTHONPATH của họ. Có cách nào để tránh điều này và sử dụng một số loại "đường dẫn tương đối" để nhập myfunc, ví dụ:
from ../code import myfunc
về cơ bản, tôi không muốn ép buộc người dùng mã thay đổi PYTHONPATH trừ khi tôi có thể làm điều đó theo chương trình cho chúng từ bên trong tập lệnh của tôi. Tôi muốn nó làm việc ra khỏi hộp.
Làm cách nào để thực hiện điều này? hoặc là giải pháp tốt: thay đổi PYTHONPATH theo lập trình, hoặc lý tưởng hơn, tham chiếu đến "mã" bằng cách sử dụng một loại nhập tương đối, vì mặc dù tôi không biết "project/code.py" ở đâu trên máy tính của người dùng, tôi biết nó liên quan đến "myfunc".
EDIT: Ai đó có thể vui lòng hiển thị ví dụ thích hợp về nhập gói nội bộ không? Tôi đã thử, từ "mymodule1" để làm:
from .. import foo
trong đó "foo" nằm trong code.py nhưng nó không hoạt động. Tôi có init py trong mymodule1, vì vậy:
project/code.py
project/mymodule1/__init__.py
project/mymodule1/module1_code.py
nơi module1_code.py cố gắng nhập foo, một chức năng được xác định trong "code.py". EDIT: Sự nhầm lẫn chính tôi vẫn có là ngay cả sau khi chấp nhận ví dụ được đưa ra để trả lời thông báo của tôi, hiển thị phân cấp dự án/sub1/test, bạn vẫn không thể "cd" vào sub1 và làm "python test.py "và có nó hoạt động. Người dùng phải nằm trong thư mục chứa "project" và làm "import project.sub1.test". Tôi muốn điều này làm việc bất kể thư mục người dùng đang ở. Người dùng trong trường hợp này phải thực thi tệp "test.py", nằm trong dự án/sub1 /. Vì vậy, các trường hợp thử nghiệm là:
$ cd project/sub1
$ python test.py
trong đó sản lượng các lỗi:
ValueError: Attempted relative import in non-package
cách này có thể được cố định?
cảm ơn.
'code.py' cũng có nhập' mymodule1/test.py' không? Nếu có, bạn sẽ muốn xem xét sắp xếp lại mã của mình. Nên tránh nhập khẩu thông tư nếu có thể. – Wilduck