Saya tidak berpengalaman tentang python, jadi jika ada yang salah dengan kata-kata saya, katakan saja. Jika hierarki file Anda diatur seperti ini:
project\
module_1.py
module_2.py
module_1.py
mendefinisikan fungsi yang disebut func_1()
, module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
dan Anda menjalankan python module_2.py
dalam cmd, itu akan menjalankan apa yang func_1()
mendefinisikan. Biasanya itulah cara kami mengimpor file hierarki yang sama. Tetapi ketika Anda menulis from .module_1 import func_1
di module_2.py
, python interpreter akan mengatakan No module named '__main__.module_1'; '__main__' is not a package
. Jadi untuk memperbaikinya, kita hanya menyimpan perubahan yang baru saja kita buat, dan memindahkan kedua modul ke sebuah paket, dan menjadikan modul ketiga sebagai penelepon untuk dijalankan 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()
Tapi alasan kita menambahkan .
sebelum module_1
di module_2.py
adalah bahwa jika kita tidak melakukan itu dan lari main.py
, python interpreter akan mengatakan No module named 'module_1'
, itu sedikit rumit, module_1.py
tepat di samping module_2.py
. Sekarang aku membiarkan func_1()
dalam module_1.py
do sesuatu:
def func_1():
print(__name__)
yang __name__
merekam siapa yang memanggil func_1. Sekarang kita simpan .
sebelumnya module_1
, jalankan main.py
, itu akan mencetak package_1.module_1
, bukan module_1
. Ini menunjukkan bahwa orang yang memanggil func_1()
berada pada hierarki yang sama dengan main.py
, yang .
menyiratkan yang module_1
berada pada hierarki yang sama dengan module_2.py
dirinya. Jadi, jika tidak ada titik, main.py
akan mengenali module_1
hierarki yang sama dengan dirinya, ia dapat mengenalipackage_1
, tetapi bukan apa yang "di bawah" itu.
Sekarang mari kita membuatnya agak rumit. Anda memiliki config.ini
dan modul mendefinisikan fungsi untuk membacanya di hierarki yang sama dengan 'main.py'.
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Dan untuk beberapa alasan yang tidak dapat dihindari, Anda harus memanggilnya module_2.py
, sehingga harus mengimpor dari hierarki atas. module_2.py :
import ..config
pass
Dua titik berarti impor dari hierarki atas (tiga titik akses atas dari atas, dan seterusnya). Sekarang kita jalankan main.py
, penafsir akan berkata: ValueError:attempted relative import beyond top-level package
. "Paket tingkat atas" di sini adalah main.py
. Hanya karena config.py
ada di samping main.py
, mereka berada di hierarki yang sama, config.py
tidak "di bawah" main.py
, atau tidak "dipimpin" oleh main.py
, jadi itu di luar main.py
. Untuk memperbaikinya, cara paling sederhana adalah:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Saya pikir itu bertepatan dengan prinsip mengatur hierarki file proyek, Anda harus mengatur modul dengan fungsi yang berbeda di folder yang berbeda, dan hanya meninggalkan pemanggil teratas di luar, dan Anda dapat mengimpor sesuka Anda.