"ImportError: No module named" ketika mencoba menjalankan skrip Python

144

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.

CodeOcelot
sumber
4
Anda perlu memberikan informasi lebih lanjut. Ketika Anda mengatakan "jalankan skrip", apakah maksud Anda skrip shell? Modul apa yang tidak bisa Anda impor? Di mana modul itu berada? Di mana skrip Anda berada?
BrenBarn
2
Jika Anda menginginkan jawaban pasti untuk "apa yang terjadi", mulailah python dengan -vopsi dan Anda akan melihat di mana python berada (atau tidak) menemukan modul yang Anda impor.
FatalError
Apa yang ingin Anda impor? Apakah kedua skrip python berada di direktori yang sama?
pynovice
2
Tolong beri kami kode yang Anda jalankan, teks lengkap dari jejak tumpukan, dan langkah-langkah tepat yang Anda ambil untuk menghasilkan kesalahan. Agak sulit untuk membantu ketika kita tidak tahu apa masalah sebenarnya.
MattDMo
5
Saya rasa ini adalah masalah yang dialami banyak pengguna, bahkan 4 tahun setelah pertanyaan pertama kali diajukan.
CodeOcelot

Jawaban:

182

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

import os
os.getcwd() 

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 menggunakan c.NotebookManager.notebook_dirpengaturan).

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:

import sys
sys.path.append('my/path/to/module/folder')

import module-of-interest

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 .

tyleha
sumber
1
PSA: jika Anda sampai pada pertanyaan SO ini karena Anda mendapatkan kesalahan ini di jupyter-notebook, kemudian lihat di bawah, stackoverflow.com/a/27944947/127971 Sayangnya, pertanyaannya tidak cukup spesifik untuk satu jawaban.
michael
@ Michael jawaban itu adalah tentang mengimpor modul Python dalam kasus umum; file init.py dunder diperlukan ketika penerjemah mencari direktori untuk modul yang akan diimpor, notebook atau tidak. Jawaban di atas tentang direktori kerja juru bahasa notebook dan pengaturan PYTHONPATH sudah benar.
BoltzmannBrain
Saya memang mengatakan akan ada beberapa jawaban yang benar, karena kata-kata dari pertanyaan itu. Saya tidak menyiratkan jawaban ini tidak benar. Tetapi jika menggunakan jupyter-notebook, Anda hanya akan menyentuh file __init_.py, kan? ... dan, tidak akan mau memodifikasi PYTHONPATHatau menelepon sys.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.
michael
16

Cukup buat file python kosong dengan nama di __init__.pybawah folder yang menunjukkan kesalahan, saat Anda menjalankan proyek python.

Mohideen bin Mohammed
sumber
1
Maksudnya ' init.py ' maksud Anda '_ init_ .py', kan? Saya membuat _ init_ .py sebagai file kosong dan berhasil bagi saya. Terima kasih banyak. Tetapi mengapa ini dibutuhkan? Sebelumnya saya punya skrip python di direktori yang sama dengan notebook ipython saya dan impornya berfungsi dengan baik.
Eduardo Reis
3
sebenarnya init .py digunakan untuk menunjukkan python untuk menunjukkan ada beberapa paket yang berisi di lokasi yang sesuai. maka hanya akan ditemukan sub modul apa pun yang Anda buat di bawahnya. jika Anda tidak membuat ' init .py' berarti python tidak tahu ada beberapa paket di dalamnya. Contoh: dari "Myfolder.Mypackage import Mymodules" untuk contoh ini, Anda harus memulai init .py untuk menunjukkan python untuk memberi tahu ada beberapa paket di sini. selain itu tidak tahu.
Mohideen bin Mohammed
1
Yap, jawaban sempurna. Itu diperlukan dalam python 2.7, tetapi perhatikan dalam 3
Agape Gal'lo
ini memperbaiki masalah di python 3 untuk saya.
Rick mendukung Monica
memperbaiki masalah bagi saya juga - menggunakan jupyter notebook, dengan sumber python di subdirektori file ipynb; mis. foo.ipynbmenggunakan bar/baz.py, tambahkan bar/__init__.pyfile kosong agar notebook dapat menggunakanfrom bar.baz import MyClass
michael
12

Pastikan keduanya menggunakan juru bahasa yang sama. Ini terjadi pada saya di Ubuntu:

$ ipython3 -c 'import sys; print(sys.version)'
3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]

$ python3 -c 'import sys; print(sys.version)'
3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]

Dan sys.pathberbeda antara kedua penafsir. Untuk memperbaikinya, saya menghapus Python 3.3.

z0r
sumber
Setelah menggunakan miniconda untuk menginstal banyak hal yang berhubungan dengan python saya juga mendapatkan masalah ini. Ubuntu python 2.7 yang dibundel berbeda dengan miniconda python 2.7. Jawaban ini memungkinkan saya untuk memperbaiki masalah ini
bph
4
Ini masalah saya. Saya telah memutakhirkan ke python 2.7.11 tetapi shell interaktif iPython saya masih menggunakan 2.7.5. Saya hanya perlu menjalankan pip install --upgrade ipythonuntuk mendapatkan versi terbaru dan kemudian secara otomatis menggunakan 2.7.11 secara default.
Abundnce10
IPython saya adalah 7.4.0 sementara tidak ada versi Python sama sekali.
aderchox
@aderchox Jalankan ini dalam ipython untuk mendapatkan versi juru bahasa:import sys; sys.version
z0r
7

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:

import cv2
ImportError: ...

1. Periksa jalur dengan Python dan iPython dengan perintah berikut

import sys
sys.path

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:

import sys
sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages')
import cv2

yang ImportError:..masalah dipecahkan

3. Solusi permanen

Buat profil iPython dan atur penambahan awal:

Di bash shell:

ipython profile create
... CHECK the path prompted , and edit the prompted config file like my case
vi /home/osboxes/.ipython/profile_default/ipython_kernel_config.py

Pada vi, tambahkan file:

c.InteractiveShellApp.exec_lines = [
 'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]

DIBUAT

Jesse
sumber
'ipython profile create' .... Ya! Ini adalah satu-satunya solusi (permanen) yang menangani notebook jupyter yang tidak membaca dari lingkungan PATH dan PYTHONPATH ... tanpa menggunakan pernyataan sys.path yang berantakan di awal setiap file (yuk). terima kasih @jesse.
JohnL_10
6

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 menambahkan export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"ke ~/.bash_profilefile Anda .

acannon828
sumber
2

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.

pandorabob
sumber
2

Punya masalah yang sama, memperbaikinya dengan memanggil python3bukannya python, modul saya berada di Python3.5.

peter n
sumber
2

Jika Anda menjalankannya dari baris perintah, kadang-kadang interpreter python tidak mengetahui jalur tempat mencari modul.

Di bawah ini adalah struktur direktori proyek saya:

/project/apps/..
/project/tests/..

Saya menjalankan perintah di bawah ini:

>> cd project

>> python tests/my_test.py

Setelah menjalankan perintah di atas saya mendapat kesalahan di bawah ini

no module named lib

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.

import sys
import os

module_path = os.path.abspath(os.getcwd())    

if module_path not in sys.path:       

    sys.path.append(module_path)

Saya tidak yakin apakah itu cara yang baik untuk menyelesaikannya tapi ya itu berhasil bagi saya.

Raghav salotra
sumber
Ini akan berfungsi jika Anda selalu menjalankan skrip dari lokasi yang sama. Kalau tidak, Anda akan mengalami masalah karena os.getcwd()mendapatkan direktori tempat skrip dijalankan, bukan direktori tempat file skrip tinggal.
Nathan Arthur
1

Inilah cara saya memperbaikinya:

import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
    sys.path.append(module_path)
pomber
sumber
1

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:

!{sys.executable} -m pip install numpy

Silakan periksa tautan di atas untuk jawaban lengkap yang berwibawa.

Rui Guerra
sumber
0

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/binadalah untuk segera menjalankan rehashatau serupa untuk shell apa pun yang Anda gunakan sehingga python / ipython yang benar akan diambil. (Harus memeriksa apakah ada pipkait pasca pemasangan yang cocok ...)

kaleissin
sumber
0

Solusi tanpa skrip:

  1. Buka Spyder -> Alat -> manajer PYTHONPATH
  2. Tambahkan jalur Python dengan mengklik "Tambah Jalur". Misalnya: 'C: \ Users \ User \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ situs-paket'
  3. Klik "Sinkronkan ..." untuk mengizinkan program lain (mis. Jupyter Notebook) menggunakan pythonpaths yang diatur pada langkah 2.
  4. Nyalakan kembali Jupyter jika terbuka
Wen
sumber
0

Ini mungkin disebabkan oleh berbagai versi python yang diinstal pada sistem Anda , yaitu python2 atau python3 .

Jalankan perintah $ pip --versiondan $ pip3 --versionuntuk memeriksa pip mana yang dari di Python 3x . Misalnya Anda harus melihat informasi versi seperti di bawah ini:

pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

Kemudian jalankan example.pyscript dengan perintah di bawah ini

$ python3 example.py
Shizhen
sumber
0

Terjadi pada saya dengan direktori utils. Saya mencoba mengimpor direktori ini sebagai:

from utils import somefile

utilssudah merupakan paket dengan python. Ubah saja nama direktori Anda menjadi sesuatu yang berbeda dan itu akan berfungsi dengan baik.

subtleseeker
sumber
0

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

python3 .....

dari pada

python
Nu-ONE
sumber
0

Jawaban ini berlaku untuk pertanyaan ini jika

  1. Anda tidak ingin mengubah kode Anda
  2. Anda tidak ingin mengubah PYTHONPATH secara permanen

Ubah sementara PYTHONPATH

jalur di bawah ini bisa relatif

PYTHONPATH=/path/to/dir python script.py
kon psik
sumber
0

import sys sys.path.append ('/ Users / {user} /Library/Python/3.7/lib/python/site-packages') impor ta

shiva kumar
sumber
-1

Hapus pathlibdan pasang kembali. Hapus pathlib di sitepackagesfolder dan instal ulang paket pathlib dengan menggunakan perintah pip:

pip install pathlib
pengguna3233042
sumber