Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Menyelesaikan Ralat 'Percubaan Import Relatif dalam Bukan Pakej' dalam Python?

Bagaimanakah Saya Boleh Menyelesaikan Ralat 'Percubaan Import Relatif dalam Bukan Pakej' dalam Python?

Barbara Streisand
Barbara Streisandasal
2024-12-24 02:21:15201semak imbas

How Can I Solve

Import Relatif dalam Python: Panduan Komprehensif

Isu: Mengimport Modul Merentasi Subpakej

Bayangkan struktur direktori berikut:

app/
   __init__.py
   sub1/
      __init__.py
      mod1.py
   sub2/
      __init__.py
      mod2.py

Untuk mengimport sesuatu daripada mod2 dalam modul mod1, kod berikut ialah percubaan:

from ..sub2 import mod2

Walau bagaimanapun, ini mengakibatkan ralat: "Percubaan import relatif dalam bukan pakej."

Penyelesaian: Pakej Diisytiharkan

Ralat berlaku kerana dengan menjalankan modul sebagai __main__ dengan menghantar hujah mod1.py kepada penterjemah, Python menganggapnya sebagai modul peringkat atas, mengabaikan pakej maklumat.

Untuk menyelesaikan isu ini, fail __init__.py mesti dimulakan dengan betul dalam kedua-dua direktori sub1 dan sub2. Ini menandakan bahawa direktori ini sememangnya pakej dan kami boleh mengimport merentasnya menggunakan import relatif.

Dengan fail __init__.py tersedia, kod berikut akan berjaya mengimport mod2 dalam mod1:

from ..sub2 import mod2

Import Relatif dan PEP 366

PEP 366 mencadangkan mekanisme untuk rujukan modul berbanding dengan modul utama. Dalam Python 2.6 dan versi yang lebih baru, anda boleh mengimport modul berbanding modul utama menggunakan sintaks berikut:

from . import mod2
from .. import sub2

Tingkah laku ini sejajar dengan kefungsian yang dijangkakan untuk import subpakej, memastikan mekanisme import yang konsisten dan intuitif.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyelesaikan Ralat 'Percubaan Import Relatif dalam Bukan Pakej' dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn