Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah import Python berfungsi?
Hello, nama saya somenzz, awak boleh panggil saya Abang Zheng.
Import Python adalah sangat intuitif, tetapi walaupun begitu, kadangkala anda akan mendapati bahawa walaupun pakej itu ada, kami masih akan menghadapi ModuleNotFoundError, dan laluan relatif jelas sangat betul, tetapi ralat dilaporkan
ImportError: attempted relative import with no known parent package
Mengimport modul dalam direktori yang sama dan modul dalam direktori berbeza sama sekali berbeza. Artikel ini menganalisis beberapa masalah yang sering dihadapi semasa menggunakan import untuk membantu anda mengendalikan import dengan mudah.
Hubungan antara modul dan pakej boleh dibandingkan dengan fail dan direktori, modul Hanya fail.
Seperti yang diterangkan dalam dokumentasi Python, fail Python ialah modul dan nama fail Python (tanpa akhiran .py) ialah nama modul.
Sesuatu modul boleh mengandungi pembolehubah, fungsi dan kelas, yang merupakan sebahagian daripada ruang nama yang ditakrifkan oleh modul, jadi penamaan pembolehubah tidak menjadi masalah kerana dua modul berbeza boleh mempunyai pembolehubah, fungsi dan kelas dengan yang sama nama .
Hubungan antara modul dan pakej boleh dibandingkan dengan fail dan direktori.
Sesuatu pakej boleh mempunyai modul atau subpakej. Modul mentakrifkan ruang nama supaya pembolehubah, fungsi dan kelas boleh mempunyai nama yang sama dalam dua modul yang berbeza .
Pakej asas boleh termasuk subpakej, modul, __init__.py (tidak diperlukan selepas Python 3.3), setup.py. Struktur pakej yang mungkin kelihatan seperti ini:
Dan setup.py wujud dalam direktori rumah tempat pakej anda terletak, mengandungi maklumat konfigurasi seperti kebergantungan yang diperlukan, Skrip dan subpakej. Anda juga boleh menentukan metadata tentang pakej, seperti nama pakej, pengarang, perihalan, dsb.
setup.py ialah fail yang pip gunakan untuk memasang pakej anda.
Mari kita ambil contoh mudah Sebagai contoh, terdapat dua fail dalam direktori yang sama, file1.py dan file2.py. hanya cetak Perbezaan antara nama fail masing-masing ialah file1 diimport dalam file2.py:
#file1.py print("This is file1.py") #file2.py print("This is file2.py") import file1
Running file2.py boleh mendapatkan hasil berikut:
❯ python file2.py This is file2.py This is file1.py
Ia boleh dilihat:
Kita juga perlu mengetahui susunan carian import. Cuma ingat satu perkara, iaitu import akan mencari dalam sys.path.
Sebagai contoh, jika saya menambah baris kod pada penghujung file2.py: import sys print(sys.path), saya boleh mencetak laluan carian import:
Dapat dilihat bahawa susunan sys.path:
Apa yang anda perlu beri perhatian tentang sys.path ialah:
Sebaik sahaja modul atau pakej ditemui, ia akan dilaksanakan. Jika terdapat fail permulaan __init__.py dalam pakej, __init__.py akan dilaksanakan terlebih dahulu apabila mengimport.
Kemudian projek yang akan diimport ditambahkan pada ruang namanya, dan kita boleh menggunakannya melalui xx.yy.
Mari kita lihat dahulu apa itu import mutlak Apa yang dipanggil import mutlak adalah dalam bentuk:
import aa import aa.bb from aa import bb
Seperti ini Kaedah ini sangat intuitif Import akan mencari dalam sys.path Jika anda menemui ModuleNotFoundError, fikirkan mengapa sys.path tidak mempunyai pakej yang ingin kami import, atau masukkan laluan pakej ke dalam sys. .laluan.
Mari kita lihat apa itu import relatif Apa yang dipanggil import relatif adalah dalam bentuk:
from . import aa from .aa import bb from .. import yy
Maksudnya, terdapat tanda dalam laluan relatif untuk menunjukkan modul untuk diimport atau modul semasa Kedudukan relatif pakej.
Sebagai contoh, kami mencipta subpakej1 direktori baharu di bawah direktori pythonimportexample dan mencipta dua fail baharu file3.py dan file4.py dalam subpakej1.
Kandungan adalah seperti berikut:
file3.py:
print("This is file3.py")
file4.py:
from . import file3 print("This is file4.py")
只要我们直接运行 file4.py,那是一定会报错的:
Python 提示我们:
ImportError: attempted relative import with no known parent package
也就是说相对导入不知道父包是谁,换句话说,这是一个子包,必须让父包来调用它,直接运行这个文件是不行的,即使你在 file4.py 的目录 subpackage1 同级的目录执行该文件也是不行的,见上图。
但是在 file4.py 的目录 subpackage1 同级的目录作为一个 module 来执行是可以的,如下图:
换句话说,我们把 subpackage1 作为一个包来让别人用,相对导入是可以的,比如说我们在目录 subpackage1 同级的目录新建一个 file5.py 的文件,内容如下:
file5.py:
from subpackage1 import file4。
然后,执行 python file5.py 可以看出,相对导入已经正常工作:
结论
先上一个图来看下目录及引用结构,方块的是目录,椭圆的是文件,曲线是引用:
其中 import_example 目录下有 setup.py 和 run.py
run.py 导入了 file4、file5、file6。
file4 导入了 file3,file5 导入了 file3。
file6 导入了 file2,file2 导入了 file1。
现在我们来执行一下 run.py 看下效果:
可以看出所有相对导入都已正常工作,虽然 file3 被导入了两次,但只执行了一次,说明 Python 内部已经考虑了同一个包的多重导入问题。
自定义包就是让其他文件导入使用的,因此 pythonimportexample目录下都使用相对导入,源代码见:
https://gitee.com/somenzz/code-example/tree/master/import_example
点阅读原文也可以直接访问。
这里还有一些自定义包的例子:
本文分享了什么是模块(module),什么是包(package),import 的搜索路径,也分享了相对导入和绝对导入的区别,最后举了一个非常实用的 import 例子,方便你构建自己的包。
Atas ialah kandungan terperinci Bagaimanakah import Python berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!