Pertanyaan Adakah yang bisa menjelaskan impor relatif python?


Saya tidak bisa untuk kehidupan saya mendapatkan impor relatif python untuk bekerja. Saya telah membuat contoh sederhana di mana itu tidak berfungsi:

Struktur direktori adalah:

/__init__.py
/start.py
/parent.py
/sub/__init__.py
/sub/relative.py

/start.py hanya berisi: import sub.relative

/sub/relative.py hanya berisi from .. import parent

Semua file lain kosong.

Saat mengeksekusi yang berikut di baris perintah:

$ cd /
$ python start.py

Saya mendapat:

Traceback (most recent call last):
  File "start.py", line 1, in <module>
    import sub.relative
  File "/home/cvondrick/sandbox/sub/relative.py", line 1, in <module>
    from .. import parent
ValueError: Attempted relative import beyond toplevel package

Saya menggunakan Python 2.6. Kenapa ini masalahnya? Bagaimana cara membuat contoh kotak pasir ini berfungsi?


148
2017-12-16 23:27


asal


Jawaban:


Anda mengimpor dari paket "sub". start.py itu sendiri tidak dalam paket bahkan jika ada __init__.py menyajikan.

Anda perlu memulai program Anda dari satu direktori parent.py:

./start.py

./pkg/__init__.py
./pkg/parent.py
./pkg/sub/__init__.py
./pkg/sub/relative.py

Dengan start.py:

import pkg.sub.relative

Sekarang pkg adalah paket tingkat atas dan impor relatif Anda harus berfungsi.


Jika Anda ingin tetap dengan tata letak Anda saat ini, Anda bisa menggunakan import parent. Karena kamu menggunakan start.py untuk meluncurkan penerjemah Anda, direktori di mana start.py terletak di jalur python Anda. parent.py tinggal di sana sebagai modul terpisah.

Anda juga dapat menghapus tingkat teratas dengan aman __init__.py, jika Anda tidak mengimpor sesuatu ke dalam skrip lebih jauh ke pohon direktori.


127
2017-12-16 23:37



Jika Anda akan menelepon relative.py secara langsung dan i.e. jika Anda benar-benar ingin mengimpor dari modul tingkat atas Anda harus secara eksplisit menambahkannya ke sys.path daftar.
Beginilah cara kerjanya:

# Add this line to the beginning of relative.py file
import sys
sys.path.append('..')

# Now you can do imports from one directory top cause it is in the sys.path
import parent

# And even like this:
from parent import Parent

Jika menurut Anda hal di atas dapat menyebabkan ketidakkonsistenan, Anda dapat menggunakan ini sebagai gantinya:

sys.path.append(sys.path[0] + "/..")

sys.path[0] mengacu pada jalur tempat titik masuk dijalankan.


21
2017-09-19 14:47