Saya mencoba menjalankan skrip yang meluncurkan, antara lain, skrip python. Saya mendapatkan ImportError: Tidak ada modul bernama ..., namun, jika saya meluncurkan ipython dan mengimpor modul yang sama dengan cara yang sama melalui interpreter, modul diterima.
Apa yang terjadi, dan bagaimana cara memperbaikinya? Saya sudah mencoba memahami bagaimana python menggunakan PYTHONPATH tapi saya benar-benar bingung. Setiap bantuan akan sangat dihargai.
python
ipython
jupyter-notebook
importerror
CodeOcelot
sumber
sumber
-v
opsi dan Anda akan melihat di mana python berada (atau tidak) menemukan modul yang Anda impor.Jawaban:
Masalah ini muncul karena cara di mana command line IPython interpreter menggunakan jalur Anda saat ini vs cara proses yang terpisah (baik itu notebook IPython, proses eksternal, dll). IPython akan mencari modul untuk diimpor yang tidak hanya ditemukan di sys.path Anda, tetapi juga di direktori kerja Anda saat ini. Saat memulai juru bahasa dari baris perintah, direktori saat ini tempat Anda beroperasi adalah sama dengan tempat Anda memulai ipython. Jika Anda menjalankan
Anda akan melihat ini benar.
Namun, katakanlah Anda menggunakan notebook ipython, jalankan
os.getcwd()
dan direktori kerja Anda saat ini adalah folder tempat Anda memerintahkan notebook untuk beroperasi dari dalam file ipython_notebook_config.py Anda (biasanya menggunakanc.NotebookManager.notebook_dir
pengaturan).Solusinya adalah menyediakan interpreter python dengan path-to-your-module. Solusi paling sederhana adalah menambahkan path itu ke daftar sys.path Anda. Di buku catatan Anda, cobalah terlebih dahulu:
Jika itu tidak berhasil, Anda memiliki masalah lain di tangan Anda yang tidak terkait dengan path-to-import dan Anda harus memberikan lebih banyak info tentang masalah Anda.
Cara yang lebih baik (dan lebih permanen) untuk menyelesaikan ini adalah dengan mengatur PYTHONPATH Anda , yang memberikan penerjemah direktori tambahan dengan mencari paket / modul python. Mengedit atau mengatur PYTHONPATH sebagai var global bergantung pada os, dan dibahas secara rinci di sini untuk Unix atau Windows .
sumber
__init_.py
, kan? ... dan, tidak akan mau memodifikasiPYTHONPATH
atau meneleponsys.path.append
, meskipun mereka juga benar (benar?). Maksud saya, saya memiliki lusinan direktori w / kode di dalamnya, dan saya tidak akan menambahkan semuanya ke path - atau mengharapkan pengguna lain ke file konfigurasi jupyter mereka, bahkan jika itu adalah satu direktori.Cukup buat file python kosong dengan nama di
__init__.py
bawah folder yang menunjukkan kesalahan, saat Anda menjalankan proyek python.sumber
foo.ipynb
menggunakanbar/baz.py
, tambahkanbar/__init__.py
file kosong agar notebook dapat menggunakanfrom bar.baz import MyClass
Pastikan keduanya menggunakan juru bahasa yang sama. Ini terjadi pada saya di Ubuntu:
Dan
sys.path
berbeda antara kedua penafsir. Untuk memperbaikinya, saya menghapus Python 3.3.sumber
pip install --upgrade ipython
untuk mendapatkan versi terbaru dan kemudian secara otomatis menggunakan 2.7.11 secara default.import sys; sys.version
Alasan utamanya adalah sys.paths dari Python dan IPython berbeda.
Silakan merujuk ke tautan lucypark , solusinya berfungsi dalam kasus saya. Itu terjadi ketika menginstal opencv oleh
conda install opencv
Dan mendapat kesalahan impor di iPython, Ada tiga langkah untuk mengatasi masalah ini:
1. Periksa jalur dengan Python dan iPython dengan perintah berikut
Anda akan menemukan hasil yang berbeda dari Python dan Jupyter. Langkah kedua, cukup gunakan
sys.path.append
untuk memperbaiki jalur yang terlewat dengan try-and-error.2. Solusi sementara
Di iPython:
yang
ImportError:..
masalah dipecahkan3. Solusi permanen
Buat profil iPython dan atur penambahan awal:
Di bash shell:
Pada vi, tambahkan file:
DIBUAT
sumber
Melakukannya
sys.path.append('my-path-to-module-folder')
akan berhasil, tetapi untuk menghindari keharusan melakukan ini di IPython setiap kali Anda ingin menggunakan modul, Anda dapat menambahkanexport PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"
ke~/.bash_profile
file Anda .sumber
Sebelum menginstal ipython, saya memasang modul melalui easy_install; katakan
sudo easy_install mechanize
.Setelah menginstal ipython, saya harus menjalankan kembali easy_install untuk ipython untuk mengenali modul-modul.
sumber
Punya masalah yang sama, memperbaikinya dengan memanggil
python3
bukannyapython
, modul saya berada di Python3.5.sumber
Jika Anda menjalankannya dari baris perintah, kadang-kadang interpreter python tidak mengetahui jalur tempat mencari modul.
Di bawah ini adalah struktur direktori proyek saya:
Saya menjalankan perintah di bawah ini:
Setelah menjalankan perintah di atas saya mendapat kesalahan di bawah ini
lib diimpor di my_test.py
saya mencetak sys.path dan menemukan bahwa jalur proyek yang saya kerjakan tidak tersedia dalam daftar sys.path
saya menambahkan kode di bawah ini di awal skrip saya
my_test.py
.Saya tidak yakin apakah itu cara yang baik untuk menyelesaikannya tapi ya itu berhasil bagi saya.
sumber
os.getcwd()
mendapatkan direktori tempat skrip dijalankan, bukan direktori tempat file skrip tinggal.Inilah cara saya memperbaikinya:
sumber
Saya telah menemukan bahwa solusi untuk masalah ini didokumentasikan secara luas di sini:
https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/
Pada dasarnya, Anda harus menginstal paket dalam lingkungan Jupyter, mengeluarkan perintah shell seperti:
Silakan periksa tautan di atas untuk jawaban lengkap yang berwibawa.
sumber
Saya menemukan sumber lain dari perbedaan ini:
Saya telah menginstal ipython secara lokal dan pada umumnya di virtualenvs. Masalah saya adalah, di dalam virtualenv yang baru dibuat dengan ipython, sistem ipython diambil, yang merupakan versi yang berbeda dari python dan ipython di virtualenv (2,7.x vs 3,5.x), dan keriuhan pun terjadi.
Saya pikir hal yang cerdas untuk dilakukan setiap kali menginstal sesuatu yang akan memiliki biner
yourvirtualenv/bin
adalah untuk segera menjalankanrehash
atau serupa untuk shell apa pun yang Anda gunakan sehingga python / ipython yang benar akan diambil. (Harus memeriksa apakah adapip
kait pasca pemasangan yang cocok ...)sumber
Solusi tanpa skrip:
sumber
Ini mungkin disebabkan oleh berbagai versi python yang diinstal pada sistem Anda , yaitu python2 atau python3 .
Jalankan perintah
$ pip --version
dan$ pip3 --version
untuk memeriksa pip mana yang dari di Python 3x . Misalnya Anda harus melihat informasi versi seperti di bawah ini:Kemudian jalankan
example.py
script dengan perintah di bawah inisumber
Terjadi pada saya dengan direktori
utils
. Saya mencoba mengimpor direktori ini sebagai:utils
sudah merupakan paket dengan python. Ubah saja nama direktori Anda menjadi sesuatu yang berbeda dan itu akan berfungsi dengan baik.sumber
Kesalahan semacam ini paling mungkin terjadi karena konflik versi python. Misalnya, jika aplikasi Anda hanya berjalan di python 3 dan Anda juga mendapatkan python 2, maka lebih baik untuk menentukan versi mana yang akan digunakan. Misalnya digunakan
dari pada
sumber
Jawaban ini berlaku untuk pertanyaan ini jika
Ubah sementara PYTHONPATH
jalur di bawah ini bisa relatif
sumber
import sys sys.path.append ('/ Users / {user} /Library/Python/3.7/lib/python/site-packages') impor ta
sumber
Hapus
pathlib
dan pasang kembali. Hapus pathlib disitepackages
folder dan instal ulang paket pathlib dengan menggunakan perintah pip:sumber