Không thể nhập * từ Thư mục con trong Python [trùng lặp]
Tôi đang tìm cách nhập một tập hợp các mô-đun từ một thư mục con vào một mô-đun chính duy nhất trong thư mục mẹ:
Dự án/
main.py
subdirectory/
__init__.py
timer.py
example.py
Tôi có thể yêu cầu bất kỳ tệp .py riêng lẻ nào như vậy:
from subdirectory import timer.py
Nhưng, nếu tôi chạy lệnh sau,
from subdirectory import *
và tôi cố gắng sử dụng một mô-đun trong thư mục con đó, tôi gặp lỗi sau:
File "My:\Path\Here\...", line 33, in main
t = timer.timer()
NameError: name 'timer' is not defined
Tôi muốn có thể nhập tất cả các tệp trong một đợt, vì tôi đang nhập một vài mô-đun. Tôi đã thêm một tệp .py init trống vào thư mục con. Có điều gì mà tôi đang thiếu?
Trả lời
Bạn phải khai báo tên mô-đun của bạn sử dụng __all__trong của bạn __init__.py:
__init__.py:
__all__ = ["timer", "example"]
Hành vi này được ghi lại :
Giải pháp duy nhất là tác giả gói cung cấp một chỉ mục rõ ràng của gói. Câu
importlệnh sử dụng quy ước sau: nếu__init__.pymã của một gói xác định một danh sách có tên__all__, nó được coi là danh sách các tên mô-đun sẽ được nhập khifrom package import *gặp phải.
Nếu bạn chỉ muốn nhập hoạt động, thì hãy thêm subdirectory/__init__.pynội dung sau:
from * import example
from * import timer
Tuy nhiên, nếu bạn muốn thực hiện việc này với một số mô-đun (cũ và mới) tùy ý, tôi nghĩ câu trả lời này có thể là những gì bạn đang tìm kiếm:
Bạn bắt đầu với cấu trúc sau:
main.py
subdirectory/
subdirectory/__init__.py
subdirectory/example.py
subdirectory/timer.py
Sau đó, nhập mọi thứ vào subdirectorytừ main.py:
from subdirectory import *
t = timer.timer()
Sau đó, thêm phần sau vào subdirectory/__init__.pymô-đun:
from os.path import dirname, basename, isfile, join
import glob
modules = glob.glob(join(dirname(__file__), "*.py"))
__all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not
f.endswith('__init__.py')]
Và vì lợi ích của subdirectory/timer.pymô-đun:
def timer():
return 42
Nhập khẩu đi như thế này.
# if you have timer.py, import it as
import timer
Thử thêm __init__.pyvào thư mục con. Bây giờ nó sẽ giống như sau:
Dự án/
main.py
subdirectory/
__init__.py
timer.py
example.py
Nếu điều đó không hiệu quả: main.pythêm vào
import sys
sys.path.append("path/to/subdirectory") # replace with the path
import timer