Saya memiliki file bernama tester.py
, terletak di /project
.
/project
memiliki subdirektori bernama lib
, dengan file bernama BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
Saya ingin mengimpor BoxTime
dari tester
. Saya sudah mencoba ini:
import lib.BoxTime
Yang menghasilkan:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
Adakah ide cara mengimpor BoxTime
dari subdirektori?
EDIT
The __init__.py
adalah masalah, tapi jangan lupa untuk merujuk BoxTime
sebagai lib.BoxTime
, atau menggunakan:
import lib.BoxTime as BT
...
BT.bt_function()
python
module
subdirectory
python-import
Adam Matan
sumber
sumber
__init__
file hardcode bodoh (tetapi jika Anda menginginkannya, cukup daftarkan hook autoloading! Inilah perbedaan antara hacky dan hackable ).import sys, os; sys.path.insert(0, os.path.abspath('..')); from sibling_package.hacks import HackyHackHack
lib
.lib\__init__.py
.Di
lib\BoxTime.py
, tulis fungsifoo()
seperti ini:Dalam kode klien Anda di direktori di atas
lib
, tulis:Jalankan kode klien Anda. Kamu akan mendapatkan:
Jauh kemudian - di linux, akan terlihat seperti ini:
sumber
lib
Anda dapat mencoba memasukkannya ke
sys.path
:sumber
cd /data
,python ../project/tester.py
. Maka itu tidak akan berhasil.Saya menulis ini karena semua orang tampaknya menyarankan Anda harus membuat
lib
direktori.Anda tidak perlu memberi nama sub-direktori Anda
lib
. Anda dapat memberi namaanything
asalkan Anda memasukkannya__init__.py
ke dalamnya.Anda dapat melakukannya dengan memasukkan perintah berikut di shell linux:
Jadi sekarang Anda memiliki struktur ini:
Maka Anda dapat mengimpor
mylib
kemain.py
seperti ini:Anda juga dapat mengimpor fungsi dan kelas seperti ini:
Fungsi variabel atau kelas yang Anda tempatkan di dalam
__init__.py
juga dapat diakses:Atau seperti ini:
sumber
utils\__init__.py
danutils\myfile.py
. (Utils mengandung kedua file) Ini adalah cara saya mencoba mengimporfrom utils.myfile import myMethod
. Tapi saya mengertiModuleNotFoundError: No module named 'utils'
. Apa yang salah? PS: Saya menggunakanDjango
dan mencoba untuk mengimporviews.py
yang pada tingkat yang sama denganutils
folderPYTHONPATH=. python path/to/program.py
Apakah direktori lib Anda mengandung
__init__.py
file?Python digunakan
__init__.py
untuk menentukan apakah direktori adalah modul.sumber
Coba
import .lib.BoxTime
. Untuk informasi lebih lanjut baca tentang impor relatif di PEP 328 .sumber
Saya melakukan ini yang pada dasarnya mencakup semua kasus (pastikan Anda memiliki
__init__.py
di folder relatif / path / ke / Anda / lib /):Contoh:
Anda ada di folder proyek Anda:
Anda ada di folder proyek lain:
Anda ingin menggunakan
/root/anotherproject/utils.py
dan memanggil fungsi foo yang ada di dalamnya.Jadi, Anda menulis di app.py:
sumber
os.path
Anda mungkin ingin menggunakanos.path.join((os.path.dirname(os.path.realpath(__file__)),'..','anotherproject')
alih-alih hardcoding '/' dalam rangkaian path Anda."../anotherproject"
tanpaos.path.dirname()
?dirname(realpath(__file__))
, maka itu akan menghitung jalur relatif ke direktori kerja Anda saat ini ketika Anda menjalankan skrip, bukan relatif terhadap tempat skrip tinggal.Buat file kosong
__init__.py
di subdirektori / lib. Dan tambahkan di awal kode utamakemudian
atau lebih baik
sumber
Hanya tambahan untuk jawaban ini.
Jika Anda ingin mengimpor semua file dari semua subdirektori , Anda dapat menambahkan ini ke root file Anda.
Dan kemudian Anda cukup mengimpor file dari subdirektori sama seperti jika file-file ini ada di dalam direktori saat ini.
Contoh kerja
Jika saya memiliki direktori berikut dengan subdirektori di proyek saya ...
Saya dapat memasukkan kode berikut di dalam
a.py
file sayaDengan kata lain, kode ini akan abstrak dari direktori mana file itu berasal.
sumber
/project/tester.py
/project/lib/BoxTime.py
buat file kosong
__init__.py
di baris sampai Anda mencapai file/project/lib/somefolder/BoxTime.py
#lib
- Kebutuhan memiliki dua item satu__init__.py
dan direktori bernama somefolder#somefolder
memiliki dua itemboxtime.py
dan__init__.py
sumber
coba ini:
from lib import BoxTime
sumber