Saya memiliki struktur proyek tulang telanjang dengan sebagian besar file python kosong demi menguji konsep dari tutorial online:

project
   |--package1
   |     |--__init__.py
   |     |--module1.py
   |
   |--package2
   |     |--__init__.py
   |     |--module2.py
   |
   |--__init__.py

Modul1.py:

from .package2.module2 import function2

Modul2.py:

def function2():
    return 0

Menjalankan module1.py secara langsung menghasilkan kesalahan ini:

Traceback (most recent call last):
  File "c:\"blahblahblah"\project\package1\module1.py", line 1, in <module>
    from .package2.module2 import function2
ImportError: attempted relative import with no known parent package

Saya telah mencoba mengurangi kerumitan masalah dengan menempatkan module2.py ke dalam folder proyek itu sendiri dan memodifikasi impor seperti yang disarankan oleh tutorial saya (dari .module2 import function2) tetapi ini menghasilkan kesalahan yang sama.

Catatan samping: Saya mendapat kesan bahwa file init tidak diperlukan untuk versi python saya, tetapi saya telah menambahkannya untuk menjaga semua basis saya tetap tertutup.

Python versi 3.9.1

Setiap petunjuk akan sangat dihargai.

1
Micahstuh 23 Desember 2020, 18:10

3 jawaban

Jawaban Terbaik

@napuzba menawarkan tautan dengan solusi yang saya cari:

ImportError: upaya impor relatif tanpa paket induk yang diketahui

Impor relatif gagal berfungsi karena module1.py tidak dapat melihat ke folder induknya untuk paket lainnya saat dijalankan secara langsung.

Panggilan yang benar membutuhkan parameter -m untuk menandakan bahwa module1 adalah modul di dalam sebuah paket. Terminal saya juga perlu naik satu direktori:

PS C:\...\"parent of project folder"> python -m project.package1.module1

Juga, module1.py perlu dimodifikasi:

from ..package2.module2 import function2
1
Micahstuh 4 Januari 2021, 18:38

Anda dapat bergabung dengan jalur paket luar di dalam jalur sumber Anda untuk impor modul relatif:

import os, sys
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..'))

Saya kira setelah ini, Anda dapat langsung melakukan:

from package2.module2 import function2
1
Jarvis 23 Desember 2020, 15:24

Saat Anda menjalankan skrip Python, direktori spesifik tempat skrip berada ditambahkan ke jalur, tetapi bukan direktori induknya.

Anda harus menambahkan direktori root ke path, sehingga Python dapat menemukan package2.

Untuk itu, Anda dapat menggunakan pathlib module (Python 3.4 atau lebih tinggi), memodifikasi module1.py sebagai berikut:

import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))

from package2.module2 import function2

Metode Path.resolve() mengembalikan nilai absolut path ke file, dan dengan parent.parent Anda mendapatkan direktori induk module1.py (direktori root). Oleh karena itu, Python sekarang dapat menemukan package2.

Selain itu, karena Anda mendapatkan jalur absolut, impor akan berfungsi terlepas dari menjalankan skrip dari direktori project atau dari package1.

1
Diego Miguel 23 Desember 2020, 15:34