Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah import Python berfungsi?

Bagaimanakah import Python berfungsi?

王林
王林ke hadapan
2023-05-15 20:13:041643semak imbas

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.

1. Apakah modul dan apakah pakej

Modul

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 .

Pakej

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:

Python 的 import 是怎么工作的?

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.

Apa yang berlaku semasa 2.import

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:

  • Import sangat intuitif, sesiapa yang menggunakannya boleh mengimportnya. Kenyataan
  • import ialah pernyataan biasa dan boleh diletakkan di mana-mana sahaja.
  • Apabila fail diimport, ia akan dilaksanakan dan kelas atau objek dalamannya akan ditambahkan pada ruang namanya.

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:

Python 的 import 是怎么工作的?

Dapat dilihat bahawa susunan sys.path:

  • akan terlebih dahulu mencari laluan di mana skrip pelaksanaan terletak
  • pustaka standard
  • pakej tapak perpustakaan pihak ketiga

Apa yang anda perlu beri perhatian tentang sys.path ialah:

  • Dalam persekitaran penterjemah, sys.path[ 0] ialah laluan di mana penterjemah dimulakan''
  • sys.path tidak bergantung pada laluan kerja program semasa - os.getcwd(), tetapi hanya bergantung pada laluan skrip pertama:

Python 的 import 是怎么工作的?

  • Jika satu modul mengimport modul lain, yang seterusnya mengimport modul lain, sys.path modul pertama ialah tempat jurubahasa mencari import kedua kenyataan.

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.

3. Bila hendak menggunakan import relatif dan bila hendak menggunakan import mutlak

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 的 import 是怎么工作的?

Python 提示我们:

ImportError: attempted relative import with no known parent package

也就是说相对导入不知道父包是谁,换句话说,这是一个子包,必须让父包来调用它,直接运行这个文件是不行的,即使你在 file4.py 的目录 subpackage1 同级的目录执行该文件也是不行的,见上图。

但是在 file4.py 的目录 subpackage1 同级的目录作为一个 module 来执行是可以的,如下图:

Python 的 import 是怎么工作的?

换句话说,我们把 subpackage1 作为一个包来让别人用,相对导入是可以的,比如说我们在目录 subpackage1 同级的目录新建一个 file5.py 的文件,内容如下:

file5.py:

from subpackage1 import file4。

然后,执行 python file5.py 可以看出,相对导入已经正常工作:

Python 的 import 是怎么工作的?

结论

  • 如果是当做脚本文件直接运行的,使用绝对导入。
  • 如果是当做模块供其他文件导入,使用相对导入。

4.一个自定义包的例子

先上一个图来看下目录及引用结构,方块的是目录,椭圆的是文件,曲线是引用:

Python 的 import 是怎么工作的?

其中 import_example 目录下有 setup.py 和 run.py

run.py 导入了 file4、file5、file6。

file4 导入了 file3,file5 导入了 file3。

file6 导入了 file2,file2 导入了 file1。

现在我们来执行一下 run.py 看下效果:

Python 的 import 是怎么工作的?

可以看出所有相对导入都已正常工作,虽然 file3 被导入了两次,但只执行了一次,说明 Python 内部已经考虑了同一个包的多重导入问题。

自定义包就是让其他文件导入使用的,因此 pythonimportexample目录下都使用相对导入,源代码见:

https://gitee.com/somenzz/code-example/tree/master/import_example

点阅读原文也可以直接访问。

这里还有一些自定义包的例子:

  • dbinterface[1]
  • transferfile[2]

最后的话

本文分享了什么是模块(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!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam