Saya memiliki struktur file seperti ini:
Folder
Common
foo1.py
TestFolder
foo2.py
Saya ingin mengimpor masuk foo2.py
dan foo1.py
. Saya mencoba tetapi tidak berfungsi di Ubuntu:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
__init__.py
file di folder Anda? ini adalah cara python membuat paket dan memungkinkan Anda untuk mengimpor modul dari paket itu. guide.python-distribute.org/creation.htmlJawaban:
Bagaimana python menemukan modul-modulnya
Modul yang diambil dengan ketat, adalah file python tunggal, sedangkan paket adalah folder yang berisi file python, disertai dengan file (bisa kosong) bernama
__init__.py
, untuk memberi tahu python itu adalah paket untuk mengimpor modul dari. Dalam kedua kasus, modul memerlukan.py
ekstensi mereka , tetapi mengimpornya dilakukan tanpa (lihat lebih lanjut di bawah).Secara default, Python mencari modul dan paketnya di
$PYTHONPATH
.Untuk mengetahui apa yang termasuk dalam $ PYTHONPATH, jalankan kode berikut dalam python (3):
Cara menambahkan direktori
Kadang
Dari dalam file python, Anda dapat menambahkan path sesekali ke path default dengan menambahkan baris berikut di bagian kepala aplikasi atau skrip python Anda:
Sebagai contoh:
jika saya memiliki folder:,
/home/myname/pythonfiles
dan saya ingin mengimpor filemodule_1.py
, terletak di direktori itu, saya menambahkan ini ke bagian kepala kode saya:Dan saya cukup mengimpor file
module_1.py
dengan:Ketika saya membuat paket dan ingin mengimpor modul dari paket, saya harus membuat folder
$PYTHONPATH
, berisi modul, disertai dengan file (dapat kosong) yang disebut__init__.py
Sebagai contoh:
Untuk mengimpor dari paket (folder) yang disebut
my_package
dalam/home/myname/pythonfiles
, tambahkan/home/myname/pythonfiles
path ke Anda$PYTHONPATH
, seperti dalam contoh 1, dan mengimpor modul yang disebutmodule_2.py
(dalam folder paket) hanya dengan: `Menambahkan direktori ke
$PYTHONPATH
secara permanen:Tambahkan baris berikut ke
~/.profile
file Anda .Subdirektori
Dari dalam suatu paket, subdirektori tidak dimasukkan begitu saja; Anda perlu "rantai" direktori. Untuk mengimpor modul
module_3.py
, foldersubfolder
di dalam folderpackagename
:Mengingat fakta bahwa semua subfolder dalam paket menyertakan
__init__.py
file mereka sendiri .Ketika sebuah modul berada di direktori yang sama dengan skrip atau aplikasi
Tidak perlu menyisipkan jalur ke modul ketika berada di direktori yang sama dengan skrip atau aplikasi, secara otomatis ditambahkan.
Contoh:
Jika saya memiliki folder, berisi
script.py
danmodule.py
, saya cukup mengimpor modul dengan:sumber
printenv PYTHONPATH
tidak ada apa - apa?sys.path.append("/path/to/your/package_or_module")
juga menambahkan jalur ke default dan itu kurang membingungkan. Dibandingkan dengansys.path.insert(0,...)
yang memiliki0
argumen pertama.Cara yang benar untuk menggunakan impor relatif adalah:
Dan Anda juga membutuhkan
__init__.py
di semua folder Anda.sumber
NB: Jawaban ini sudah usang untuk versi terbaru dari python 3, tetapi ada di sini untuk versi sebelumnya. Untuk informasi lebih lanjut, baca komentar dan https://www.python.org/dev/peps/pep-0420/
Pada dasarnya setiap folder dengan kode python yang ingin Anda tambahkan ke syspath memerlukan file __init__.py. File __init__.py ini dapat kosong.
sumber
python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"
berikut ini juga beberapa dokumentasi yang relevan, PEP 420, yang menjelaskan penambahan semantik paket namespace