Không thể nhập * từ Thư mục con trong Python [trùng lặp]

Oct 26 2020

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

3 Selcuk Oct 26 2020 at 06:42

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 khi from package import *gặp phải.

2 AndréC.Andersen Oct 26 2020 at 06:48

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
Deep_Thoughts Oct 26 2020 at 06:34

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