Saya mengembangkan / menguji paket di direktori lokal saya. Saya ingin mengimpornya di interpreter (v2.5), tetapi sys.path tidak menyertakan direktori saat ini. Sekarang saya mengetik sys.path.insert(0,'.')
. Apakah ada cara yang lebih baik?
Juga,
from . import mypackage
gagal dengan kesalahan ini:
ValueError: Attempted relative import in non-package
Jawaban:
Anda dapat menggunakan impor relatif hanya dari dalam modul yang pada gilirannya diimpor sebagai bagian dari sebuah paket - skrip atau penerjemah interaktif Anda tidak, jadi tentu saja
from . import
(yang berarti "impor dari paket yang sama tempat saya mengimpor dari") tidak tidak bekerja.import mypackage
akan baik-baik saja setelah Anda memastikan direktori induk darimypackage
dalamsys.path
(bagaimana Anda berhasil mendapatkan direktori Anda saat jauh darisys.path
saya tidak tahu -? apakah Anda memiliki sesuatu yang aneh di site.py, atau ...)Untuk mengembalikan direktori Anda saat ini ke
sys.path
sana sebenarnya tidak ada cara yang lebih baik daripada meletakkannya di sana.sumber
Lihat dokumentasi untuk sys.path:
http://docs.python.org/library/sys.html#sys.path
Kutipan:
Jadi, tidak perlu menggunakan sys.path jika Anda memulai interpreter python dari direktori yang berisi modul Anda.
Juga, untuk mengimpor paket Anda, cukup lakukan:
import mypackage
Karena direktori yang berisi paket sudah ada di sys.path, ini akan berfungsi dengan baik.
sumber
sys.path
sehingga file di sana harus ditemukan sebelum file di tempat lain di lingkungan kerja.sys.path.insert(0, new_path)
daripadasys.path.append(new_path)
.Jika Anda ingin menjalankan skrip python yang tidak dimodifikasi sehingga mengimpor pustaka dari direktori lokal tertentu, Anda dapat menyetel
PYTHONPATH
variabel lingkungan - misalnya di bash:Jika Anda hanya ingin mengimpor dari direktori kerja saat ini, gunakan
.
notasi:sumber
Buat tetap sederhana:
try: from . import mymodule # "myapp" case except: import mymodule # "__main__" case
sumber
Cara sederhana untuk membuatnya berfungsi adalah dengan menjalankan skrip Anda dari direktori induk menggunakan
-m
flag python , mispython -m packagename.scriptname
. Jelas dalam situasi ini Anda memerlukan__init__.py
file untuk mengubah direktori Anda menjadi sebuah paket.sumber
Di dalam sebuah paket jika ada setup.py , maka lebih baik menginstalnya
sumber
Penggunaan
sys.path
harus sudah menyertakan direktori saat ini.Mencoba:
import .
atau:
from . import sth
namun ini mungkin bukan praktik yang baik, jadi mengapa tidak menggunakan saja:
import mypackage
sumber
Agak terlambat ke pesta, tapi inilah yang berhasil bagi saya:
>>> import sys >>> sys.path.insert(0, '')
Rupanya, jika ada string kosong, Python tahu bahwa itu harus dicari di direktori saat ini. Saya tidak memiliki string kosong
sys.path
, yang menyebabkan kesalahan ini.sumber
Saya biasa
pathlib
menambahkan direktori modul saya ke jalur sistem saya karena saya ingin menghindari menginstal modul sebagai paket dan tanggapan @maninthecomputer tidak berfungsi untuk sayaimport sys from pathlib import Path cwd = str(Path(__file__).parent) sys.path.insert(0, cwd) from my_module import my_function
sumber