Tôi không có kinh nghiệm về trăn, vì vậy nếu có bất kỳ sai trong lời nói của tôi, chỉ cần nói với tôi. Nếu hệ thống phân cấp tệp của bạn được sắp xếp như thế này:
project\
module_1.py
module_2.py
module_1.py
định nghĩa một hàm được gọi là func_1()
, module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
và bạn chạy python module_2.py
trong cmd, nó sẽ chạy những gì func_1()
định nghĩa. Đó thường là cách chúng ta nhập các tệp phân cấp giống nhau. Nhưng khi bạn viết from .module_1 import func_1
vào module_2.py
, trình thông dịch python sẽ nói No module named '__main__.module_1'; '__main__' is not a package
. Vì vậy, để khắc phục điều này, chúng tôi chỉ cần giữ thay đổi mà chúng tôi vừa thực hiện và di chuyển cả hai mô-đun sang một gói và tạo một mô-đun thứ ba như một người gọi để chạy module_2.py
.
project\
package_1\
module_1.py
module_2.py
main.py
chính :
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
Nhưng lý do chúng tôi thêm vào .
trước đó là nếu chúng tôi không làm điều đó và chạy , thông dịch viên python sẽ nói , đó là một chút khó khăn, ở ngay bên cạnh . Bây giờ tôi cho phép trong việc phải làm một cái gì đó:module_1
module_2.py
main.py
No module named 'module_1'
module_1.py
module_2.py
func_1()
module_1.py
def func_1():
print(__name__)
rằng __name__
hồ sơ người gọi func_1. Bây giờ chúng tôi giữ .
trước module_1
, chạy main.py
, nó sẽ inpackage_1.module_1
, không module_1
. Nó chỉ ra rằng người gọi func_1()
có cùng thứ bậc với main.py
, .
hàm ý đó module_1
có cùng thứ bậc với module_2.py
chính nó. Vì vậy, nếu không có dấu chấm, main.py
sẽ nhận ra module_1
ở cùng một hệ thống phân cấp như chính nó, nó có thể nhận ra package_1
, nhưng không phải là "dưới" nó.
Bây giờ hãy làm cho nó một chút phức tạp. Bạn có một config.ini
và một mô-đun xác định một chức năng để đọc nó ở cùng một hệ thống phân cấp như 'main.py'.
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Và vì một số lý do không thể tránh khỏi, bạn phải gọi nó bằng module_2.py
, vì vậy nó phải nhập từ phân cấp cao hơn. module_2.py :
import ..config
pass
Hai dấu chấm có nghĩa là nhập từ phân cấp trên (ba dấu chấm truy cập trên so với trên, v.v.). Bây giờ chúng tôi chạy main.py
, thông dịch viên sẽ nói : ValueError:attempted relative import beyond top-level package
. "Gói cấp cao nhất" ở đây là main.py
. Chỉ vì config.py
bên cạnhmain.py
, chúng ở cùng một hệ thống phân cấp, config.py
không phải là "dưới" main.py
, hoặc nó không được "dẫn dắt" bởi main.py
vì vậy nó vượt xa main.py
. Để khắc phục điều này, cách đơn giản nhất là:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Tôi nghĩ rằng đó là trùng khớp với nguyên tắc sắp xếp phân cấp tệp dự án, bạn nên sắp xếp các mô-đun với chức năng khác nhau trong các thư mục khác nhau và chỉ để lại một người gọi hàng đầu ở bên ngoài và bạn có thể nhập bất cứ khi nào bạn muốn.