ฉันไม่เคยมีประสบการณ์เกี่ยวกับงูหลามดังนั้นถ้ามีอะไรผิดปกติในคำพูดของฉันแค่บอกฉัน หากลำดับชั้นไฟล์ของคุณจัดเรียงเช่นนี้:
project\
module_1.py
module_2.py
module_1.py
กำหนดฟังก์ชั่นที่เรียกว่าfunc_1()
, module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
และคุณเรียกใช้หน่วยเป็นpython module_2.py
cmd มันจะทำงานตามที่func_1()
กำหนด ปกติแล้วเราจะนำเข้าไฟล์ลำดับชั้นเดียวกัน แต่เมื่อคุณเขียนfrom .module_1 import func_1
ในหลามล่ามจะบอกว่าmodule_2.py
No module named '__main__.module_1'; '__main__' is not a package
เพื่อแก้ไขปัญหานี้เราเพียง แต่ทำการเปลี่ยนแปลงที่เราเพิ่งทำและย้ายโมดูลทั้งสองไปยังแพ็คเกจและทำให้โมดูลที่สามเป็นผู้เรียกเพื่อให้ทำงานmodule_2.py
ได้
project\
package_1\
module_1.py
module_2.py
main.py
main.py :
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
แต่เหตุผลที่เราเพิ่ม.
ก่อน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__)
ที่__name__
บันทึกที่เรียก func_1 ตอนนี้เราเก็บ.
ก่อนที่จะmodule_1
วิ่งmain.py
ก็จะพิมพ์ไม่package_1.module_1
module_1
มันบ่งชี้ว่าผู้ที่โทรfunc_1()
อยู่ในลำดับชั้นเดียวกันกับmain.py
ที่.
บ่งบอกว่าmodule_1
อยู่ในลำดับชั้นเดียวกับmodule_2.py
ตัวเอง ดังนั้นหากไม่มีจุดmain.py
จะรับรู้module_1
ในลำดับชั้นเดียวกันกับตัวเองมันสามารถรับรู้package_1
แต่ไม่ใช่สิ่งที่ "ภายใต้" มัน
ทีนี้มาทำให้มันซับซ้อนหน่อย คุณมีconfig.ini
และโมดูลกำหนดฟังก์ชั่นให้อ่านในลำดับชั้นเดียวกับ 'main.py'
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
และด้วยเหตุผลที่หลีกเลี่ยงไม่ได้บางอย่างคุณต้องโทรหาด้วยmodule_2.py
ดังนั้นจึงต้องนำเข้าจากลำดับชั้นด้านบน module_2.py :
import ..config
pass
สองจุดหมายถึงนำเข้าจากลำดับชั้นบน (จุดสามจุดเข้าถึงด้านบนกว่าบนและอื่น ๆ ) ตอนนี้เราทำงานล่ามจะพูดว่า:main.py
ValueError:attempted relative import beyond top-level package
"การแพคเกจระดับบนสุด" main.py
ที่นี่คือ เพียงเพราะconfig.py
อยู่ข้างmain.py
พวกเขาอยู่ในลำดับชั้นเดียวกันconfig.py
ไม่ได้ "ภายใต้" main.py
หรือมันไม่ได้เป็น "สารตะกั่ว" โดยดังนั้นจึงอยู่นอกเหนือmain.py
main.py
ในการแก้ไขปัญหานี้วิธีที่ง่ายที่สุดคือ:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
ฉันคิดว่าตรงกับหลักการจัดลำดับชั้นของไฟล์โครงการคุณควรจัดเรียงโมดูลที่มีฟังก์ชั่นที่แตกต่างกันในโฟลเดอร์ที่แตกต่างกันและเพียงแค่วางผู้โทรเข้าด้านนอกไว้ข้างนอกและคุณสามารถนำเข้าได้ตามต้องการ