Kesalahan Python "ImportError: No module named"

452

Python diinstal di direktori lokal.

Pohon direktori saya terlihat seperti ini:

(local directory)/site-packages/toolkit/interface.py

Kode saya ada di sini:

(local directory)/site-packages/toolkit/examples/mountain.py

Untuk menjalankan contoh, saya menulis python mountain.py, dan dalam kode yang saya miliki:

from toolkit.interface import interface

Dan saya mendapatkan kesalahan:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

Saya sudah memeriksa sys.pathdan di sana saya memiliki direktori /site-packages. Juga, saya memiliki file __init__.py.bindi folder toolkit untuk menunjukkan kepada Python bahwa ini adalah paket. Saya juga punya __init__.py.bindi direktori contoh.

Aku tidak tahu mengapa Python tidak dapat menemukan file bila dalam sys.path. Ada ide? Bisakah itu menjadi masalah izin? Apakah saya memerlukan izin eksekusi?

Eduardo
sumber
3
Pastikan Anda telah membaca izin untuk file itu dari python. Lihat: stackoverflow.com/a/20999950/1657225
cSn
1
Pastikan untuk menandai direktori Anda sebagai "Resources Root" untuk memberi tahu PyCharm bahwa ini adalah sebuah paket.
emmmphd
Masalah dalam kasus saya adalah bahwa ada izin untuk modul yang baru diinstal tidak 755. Itu karena umaskpada mesin itu 0027karena yang otherstidak memiliki readizin menyebabkan modul tidak dapat dibaca. Menambahkan readizin memperbaiki masalah saya. Ada baiknya memeriksa izin direktori target pasca-instalasi.
anu
Coba hancurkan url: stackoverflow.com/questions/47887614/…
Rawan-25
mungkin nama direktori lokal interface (telah menjadi konflik).
Benyamin Jafari

Jawaban:

267

Berdasarkan komentar Anda pada posting orip, saya kira inilah yang terjadi:

  1. Anda diedit __init__.pydi windows.
  2. Editor windows menambahkan sesuatu yang tidak dicetak, mungkin carriage-return (end-of-line di Windows adalah CR / LF; di unix itu hanya LF), atau mungkin CTRL-Z (windows end-of-file).
  3. Anda menggunakan WinSCP untuk menyalin file ke kotak unix Anda.
  4. WinSCP berpikir: "Ini memiliki sesuatu yang bukan teks dasar; Saya akan meletakkan ekstensi .bin untuk menunjukkan data biner."
  5. Hilang __init__.py(sekarang disebut __init__.py.bin) berarti python tidak memahami toolkit sebagai paket.
  6. Anda membuat __init__.pydi direktori yang sesuai dan semuanya berfungsi ...?
John Fouhy
sumber
50
Juga, python -c 'sys import sys; print sys.path 'help - terkadang pengguna menempatkan file di jalur yang tidak dipindai.
mikebabcock
1
Saya menggunakan hal yang sama kecuali WinSCP tidak menambahkan .bin.
pengguna
9
jika saya memiliki "__init__.py" kosong, apakah hal yang sama akan terjadi?
dietbacon
2
OMG, Anda berkuasa! Ini cerita saya: 1. Anda mengedit init .py di windows 2. Ini menambahkan TAB sebagai ganti spasi 3. Anda banyak google sampai menemukan posting ini! ;)
GBrian
1
Bagi saya masalahnya adalah saya menggunakan python driver.pyketika saya seharusnya menggunakan python3 driver.pysejak saya menginstal pip3.
Eric Wiener
72

Apakah

(local directory)/site-packages/toolkit

punya __init__.py?

Untuk membuat impor berjalan melalui direktori Anda, setiap direktori harus memiliki __init__.pyfile.

igorgue
sumber
1
Poin bagus! Catatan: Sejak Python 3.3, direktori apa pun di sys.path dengan nama yang cocok dengan nama paket akan dikenali.
PatrickT
1
bukankah ini hanya diperlukan untuk referensi jalur relatif? mengapa harus setiap direktori memilikinya?
Sonic Soul
56

Saya mengalami sesuatu yang sangat mirip ketika saya melakukan latihan ini di LPTHW; Saya tidak pernah bisa mendapatkan Python untuk mengenali bahwa saya memiliki file di direktori tempat saya menelepon. Tetapi pada akhirnya saya bisa membuatnya bekerja. Apa yang saya lakukan, dan apa yang saya rekomendasikan, adalah untuk mencoba ini:

(CATATAN: Dari posting awal Anda, saya berasumsi Anda menggunakan mesin berbasis * NIX dan menjalankan beberapa hal dari baris perintah, jadi saran ini disesuaikan dengan itu. Karena saya menjalankan Ubuntu, inilah yang saya lakukan)

1) Ubah direktori (cd) ke direktori di atas direktori tempat file Anda berada. Dalam hal ini, Anda mencoba menjalankan mountain.pyfile, dan mencoba memanggil toolkit.interface.pymodul, yang berada di direktori terpisah. Dalam hal ini, Anda akan pergi ke direktori yang berisi path ke kedua file tersebut (atau dengan kata lain, direktori terdekat yang path dari kedua file tersebut bagi). Yang dalam hal ini adalah toolkitdirektori.

2) Ketika Anda berada di tookitdirektori, masukkan baris kode ini pada baris perintah Anda:

export PYTHONPATH=.

Ini menetapkan PYTHONPATH Anda menjadi ".", Yang pada dasarnya berarti bahwa PYTHONPATH Anda sekarang akan mencari file yang disebut di dalam direktori tempat Anda berada saat ini, (dan lebih tepatnya, di cabang sub-direktori dari direktori tempat Anda berada. Jadi tidak hanya melihat di direktori Anda saat ini, tetapi di semua direktori yang ada di direktori Anda saat ini).

3) Setelah Anda mengatur PYTHONPATH Anda pada langkah di atas, jalankan modul Anda dari direktori Anda saat ini ( toolkitdirektori). Python sekarang harus menemukan dan memuat modul yang Anda tentukan.

Semoga ini membantu. Saya cukup frustrasi dengan ini sendiri.

Specterace
sumber
2
Atau di Windows set PYTHONPATH=..
cjbarth
Ini berhasil untuk saya. Juga SEPENUHNYA menyederhanakan frustrasi PYTHONPATH saya, karena saya harus memperbaruinya ke jalur absolut setiap kali saya beralih mesin. Terima kasih terima kasih terima kasih.
the_e
41

Pada * nix, juga pastikan bahwa PYTHONPATH dikonfigurasi dengan benar, terutama yang memiliki format ini:

 .:/usr/local/lib/python

(Pikirkan .:di awal, sehingga dapat mencari di direktori saat ini juga.)

Mungkin juga di lokasi lain, tergantung pada versinya:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.
Renaud
sumber
6
Ini juga mungkin .:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7dan lain-lain tergantung pada versi
Nikita Volkov
Bagi saya, modul ini ada di /usr/local/lib/python3.4/dist-packages tetapi ketika saya mengetik python3 di terminal (ubuntu), dan mencoba mengimpornya, itu tidak mengizinkan saya, mengatakan bahwa itu tidak ada. "ImportError: tidak ada modul x"
user65165
Menambahkan #!/usr/bin/pythondi akhir file juga harus berhasil, bukan?
Nearoo
1
@Nearoo Saya tidak berpikir bahwa akan bekerja. Plus biasanya shebang ini ditambahkan di bagian atas file.
Renaud
2
Pada MacOSX memperbaikinya dengan menambahkan PYTHONPATH = / usr / local / lib / python2.7 / paket-situs ke skrip startup.
Johan Snowgoose
23

Saya memecahkan masalah saya sendiri, dan saya akan menulis ringkasan tentang hal-hal yang salah dan solusinya:

File harus dipanggil dengan tepat __init__.py. Jika ekstensi berbeda seperti dalam kasus saya .py.binmaka Python tidak dapat bergerak melalui direktori dan kemudian tidak dapat menemukan modul. Untuk mengedit file, Anda perlu menggunakan editor Linux, seperti vi atau nano . Jika Anda menggunakan editor Windows ini akan menulis beberapa karakter tersembunyi.

Masalah lain yang mempengaruhi itu adalah bahwa saya memiliki versi Python lain yang diinstal oleh root, jadi jika seseorang bekerja dengan instalasi lokal python, pastikan bahwa instalasi Python yang menjalankan program adalah Python lokal. Untuk memeriksanya, lakukan saja which python, dan lihat apakah executable-nya ada di direktori lokal Anda. Jika tidak, ubah jalurnya, tetapi pastikan direktori Python lokal lebih dulu dari pada Python lainnya.

Eduardo
sumber
Masalah yang saya dapatkan adalah modul (re) diinstal oleh pip dengan hanya pengguna root untuk mengaksesnya, sehingga pengguna yang menjalankan program tidak melihatnya.
Jānis Elmeris
@ JānisElmeris dapatkah Anda menjelaskan lebih lanjut tentang komentar di atas, saya pikir saya juga menghadapi kesalahan serupa. Saya memiliki __init__.pyfile saya ditempatkan di direktori yang relevan tetapi saya secara manual menginstal paket menggunakan setup.py. Bagaimana menginstal paket baru akan mengganggu impor.
Krishna Oza
@darth_coder, maaf, itu enam tahun yang lalu dan saya tidak ingat kasusnya. Juga, saya berurusan dengan Python sangat sedikit, tidak sama sekali belakangan ini. Dari apa yang saya tulis, saya hanya bisa berpikir bahwa saya menginstal paket sebagai root, yang mengubah izin sehingga pengguna lain tidak memiliki akses yang mereka miliki sebelumnya.
Jānis Elmeris
19

solusi mudah adalah dengan menginstal modul menggunakan python -m pip install <library-name>bukan pip install <library-name> Anda dapat menggunakan sudo jika terjadi pembatasan admin

Badr Bellaj
sumber
2
Apa yang python -mdicapai di depan pip install?
sporc
1
@sporc - ketika Anda menggunakan flag -m command-line, Python akan mengimpor modul atau paket untuk Anda dan kemudian menjalankannya sebagai skrip. Saat Anda tidak menggunakan flag -m, file yang Anda beri nama dijalankan hanya sebagai skrip.
Tony Ciccarone
Tidak yakin apa jawaban yang coba dikatakan wrt ini python -m pip...berfungsi, tetapi pip...tidak: mereka secara efektif adalah hal yang sama, dengan asumsi mereka sebenarnya berada di pythondirektori yang sama . Kemungkinan, situasi yang diamati adalah bahwa program yang berdiri sendiri piptidak tersedia di beberapa rilis python yang lebih lama (tetapi sekarang dalam 2.7 terbaru & 3.x). Dalam hal ini, pythonitu ada di virtualenv lokal dan piptidak, jadi python -m pip installakan menginstal di virtualenv lokal, sedangkan pipakan mencoba untuk menginstal di sistem python (dan gagal tanpa sudo). Bagaimanapun, itu tidak masuk akal.
michael
17

Untuk menandai direktori sebagai paket Anda memerlukan file yang bernama __init__.py, apakah ini membantu?

orip
sumber
Saya sudah memiliki file bernama init .py.bin, Jika saya mengubah nama menjadi init .py, maka saya mendapatkan kesalahan ini: /__init__.py ", baris 1" utilitas "," demo "] ^ SintaksError: sintaks tidak valid
Eduardo
Apa yang ada di init .py? Posting itu sebagai bagian dari pertanyaan Anda.
S.Lott
Tidak ada apa-apa, kosong, dengan paket yang saya unduh, apakah saya perlu menulis sesuatu di file ?.
Eduardo
@ S.Lott: Anda tidak perlu memasukkan apa pun ke init .py, bukan?
igorgue
1
@Eduardo. Anda init py mendapat kesalahan. Dan Anda mengatakan itu kosong. Itu sulit untuk didamaikan. Dan itu tidak bisa disebut init .py.bin - Python akan mengabaikan file ini. Biasanya, tidak ada apa-apa di dalamnya.
S.Lott
16

Menggunakan PyCharm(bagian dari paket JetBrains) Anda perlu mendefinisikan direktori skrip Anda sebagai Sumber:
Right Click > Mark Directory as > Sources Root

MonoThreaded
sumber
12

Anda membaca jawaban ini mengatakan bahwa Anda __init__.pyberada di tempat yang tepat, Anda telah menginstal semua dependensi dan Anda masih mendapatkan ImportError.

Saya menghadapi masalah yang sama kecuali bahwa program saya akan berjalan dengan baik ketika dijalankan menggunakan PyCharm tetapi kesalahan di atas ketika saya akan menjalankannya dari terminal. Setelah menggali lebih jauh, saya menemukan bahwa PYTHONPATHtidak memiliki entri untuk direktori proyek. Jadi, saya mengatur PYTHONPATHper pernyataan Impor berfungsi pada PyCharm tetapi tidak dari terminal :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

Ada cara lain untuk melakukan ini menggunakan sys.path:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

Anda dapat menggunakan insert / append berdasarkan urutan di mana Anda ingin proyek Anda dicari.

rata-rata
sumber
12

Bagi saya, itu adalah sesuatu yang sangat bodoh. Saya menginstal perpustakaan menggunakan pip3 installtetapi menjalankan program saya python program.pysebagai lawan python3 program.py.

kev
sumber
1
Wow ! Itu berhasil bagi saya juga.
JavaDeveloper
1
Kamu menyelamatkan hariku.
Aymen
7

Ya. Anda memerlukan direktori untuk memuat __init__.pyfile tersebut, yaitu file yang menginisialisasi paket. Di sini, lihat ini .

File __init__.py diperlukan untuk membuat Python memperlakukan direktori sebagai berisi paket; ini dilakukan untuk mencegah direktori dengan nama umum, seperti string, dari menyembunyikan modul valid yang terjadi kemudian pada jalur pencarian modul. Dalam kasus yang paling sederhana, __init__.py dapat berupa file kosong, tetapi juga dapat mengeksekusi kode inisialisasi untuk paket atau mengatur variabel __all__, dijelaskan nanti.

miya
sumber
6
  1. Anda harus memiliki file __ init__.py di direktori yang sama dengan file yang Anda impor.
  2. Anda tidak dapat mencoba mengimpor file yang memiliki nama yang sama dan menjadi file dari 2 folder yang dikonfigurasi pada PYTHONPATH.

misalnya: / etc / environment

PYTHONPATH = $ PYTHONPATH: / opt / folder1: / opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

Dan, jika Anda mencoba mengimpor file foo, python tidak akan tahu yang mana yang Anda inginkan.

dari impor foo ... >>> importrorror: tidak ada modul bernama foo

Iasmini Gomes
sumber
5

Dua sen saya:

masukkan deskripsi gambar di sini

Meludah:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

Ini membingungkan saya - pergi melalui posting dan posting menyarankan hacks syspath jelek (seperti yang Anda lihat saya __init__.pysemua ada di sana). Nah ternyata game / oblivion.py dan game / oblivion itu membingungkan python yang memuntahkan "No module bernama RecordGroups" yang agak tidak membantu. Saya akan tertarik dengan solusi dan / atau tautan yang mendokumentasikan perilaku (nama yang sama) ini -> EDIT (2017.01.24) - lihat Bagaimana Jika Saya Memiliki Modul dan Paket Dengan Nama yang Sama? Biasanya paket menarik diutamakan tetapi tampaknya peluncur kami melanggar ini.

EDIT (2015.01.17): Saya tidak menyebutkan kami menggunakan peluncur khusus yang dibedah di sini .

Mr_and_Mrs_D
sumber
lebih seperti jalan mati. game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py Mungkin ingin memperbaikinya dengan menambahkan kode python Anda untuk menggunakan:game.oblivion.patchers.RecordGroups
Dwight Spencer
@DwightSpencer: Saya yakin saya mengimpor "RecordGroups" di game.oblivion.__init__.pytetapi mungkin harus memeriksa ini
Mr_and_Mrs_D
4

Linux: Modul yang diimpor terletak di /usr/local/lib/python2.7/dist-packages

Jika Anda menggunakan modul yang dikompilasi dalam C, jangan lupa untuk chmod file .so setelah sudo setup.py install.

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
KrisWebDev
sumber
3

Dalam kasus saya, masalahnya adalah saya menautkan ke debug python & boost::Python, yang mengharuskan ekstensi menjadi FooLib_d.pyd, bukan hanya FooLib.pyd; mengganti nama file atau memperbarui CMakeLists.txtproperti memperbaiki kesalahan.

peter karasev
sumber
3

Jika Anda telah mencoba semua metode yang disediakan di atas tetapi gagal, mungkin modul Anda memiliki nama yang sama dengan modul bawaan. Atau, modul dengan nama yang sama ada di folder yang memiliki prioritas tinggi sys.pathdaripada modul Anda.

Untuk debug, ucapkan from foo.bar import bazkeluhan Anda ImportError: No module named bar. Mengubah ke import foo; print foo, yang akan menunjukkan jalur foo. Apakah itu yang Anda harapkan?

Jika tidak, Ubah nama fooatau gunakan impor absolut .

liushuaikobe
sumber
1
Bagi saya, ini menghasilkan ImportError: No module named foo.
alex
3

Masalah saya adalah saya menambahkan direktori dengan __init__.pyfile ke PYTHONPATH, padahal sebenarnya saya perlu menambahkan direktori induknya.

Kaya
sumber
3

Untuk semua yang masih memiliki masalah ini. Saya percaya Pycharm bingung dengan impor. Bagi saya, ketika saya menulis 'dari namespace impor sesuatu', baris sebelumnya akan digarisbawahi dalam warna merah, menandakan bahwa ada kesalahan, tetapi berfungsi. Namun '' dari .namespace mengimpor sesuatu 'tidak digarisbawahi, tetapi juga tidak berfungsi.

Mencoba

try:
    from namespace import something 
except NameError:
    from .namespace import something
AKJ
sumber
1
Yang pertama adalah sintaks python 2, yang kedua adalah python 3.
Tanya Branagan
2

Memperbaiki masalah saya dengan menulis print (sys.path)dan menemukan bahwa python menggunakan paket-paket yang sudah ketinggalan zaman meskipun instalasinya bersih. Menghapus python buatan ini secara otomatis menggunakan paket yang benar.

lemon
sumber
2

Dalam kasus saya, karena saya menggunakan PyCharm dan PyCharm membuat 'venv' untuk setiap proyek di folder proyek, tetapi itu hanya env mini dari python. Meskipun Anda telah menginstal pustaka yang Anda butuhkan dengan Python, tetapi dalam proyek khusus Anda 'venv', itu tidak tersedia. Ini adalah alasan sebenarnya dari 'ImportError: Tidak ada modul bernama xxxxxx' terjadi di PyCharm. Untuk mengatasi masalah ini, Anda harus menambahkan perpustakaan ke proyek kustom Anda dengan langkah-langkah berikut:

  • Di PyCharm, dari menu 'File' -> Pengaturan
  • Dalam dialog Pengaturan, Project: XXXProject-> Project Interpreter
  • Klik tombol "Tambah", itu akan menampilkan dialog 'Paket yang Tersedia'
  • Cari perpustakaan Anda, klik 'Instal Paket'
  • Kemudian, semua paket yang Anda butuhkan akan diinstal di folder 'venv' kustom proyek Anda.

Dialog pengaturan

Nikmati.

Yuanhui
sumber
0

Setelah hanya mengalami masalah yang sama saya menemukan resolusi saya adalah untuk menghapus semua pycfile dari proyek saya, sepertinya file cache ini entah bagaimana menyebabkan kesalahan ini.

Cara termudah yang saya temukan untuk melakukan ini adalah menavigasi ke folder proyek saya di Windows explorer dan mencari *.pyc, lalu memilih semua ( Ctrl+ A) dan menghapusnya ( Ctrl+ X).

Mungkin saya bisa menyelesaikan masalah saya dengan hanya menghapus pycfile tertentu tetapi saya tidak pernah mencoba ini

Ucapkan se
sumber
0

Saya menghadapi masalah yang sama: Import error. Selain itu perpustakaan telah diinstal 100% dengan benar. Sumber masalahnya adalah bahwa pada versi python PC 3 saya (paket anaconda) telah diinstal). Inilah sebabnya perpustakaan diinstal tidak ke tempat yang tepat. Setelah itu saya baru saja mengubah ke versi python yang tepat di IDE PyCharm saya.

Rocketq
sumber
0

Saya memiliki kesalahan yang sama. Itu disebabkan oleh seseorang yang membuat folder di folder yang sama dengan skrip saya, nama yang bertentangan dengan modul yang saya impor dari tempat lain. Alih-alih mengimpor modul eksternal, itu terlihat di dalam folder ini yang jelas tidak mengandung modul yang diharapkan.

Toivo Säwén
sumber
0

Saya memiliki masalah yang sama (Python 2.7 Linux), saya telah menemukan solusinya dan saya ingin membagikannya. Dalam kasus saya, saya memiliki struktur di bawah ini:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

Di 'main.py' saya telah mencoba semua kombinasi dengan gagal di bawah ini:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

Solusinya jauh lebih sederhana daripada yang saya kira. Saya mengganti nama folder "Booklet" menjadi "booklet" dan hanya itu. Sekarang Python dapat mengimpor Pertanyaan kelas secara normal dengan menggunakan kode 'main.py':

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

Dari sini saya dapat menyimpulkan bahwa Paket-Nama (folder) seperti 'buklet' harus dimulai dari huruf kecil, kalau tidak Python membingungkannya dengan nama Kelas dan Nama File.

Tampaknya, ini bukan masalah Anda, tetapi jawaban John Fouhy sangat bagus dan utas ini memiliki hampir semua hal yang dapat menyebabkan masalah ini. Jadi, ini satu hal lagi dan saya berharap mungkin ini bisa membantu orang lain.

ioaniatr
sumber
0

Dalam kasus saya, saya memasukkan path ke folder package.egg daripada paket aktual di bawahnya. Saya menyalin paket ke tingkat atas dan berhasil.

Fakrudeen
sumber
0

Ini berfungsi untuk saya: Membuat __init__.pyfile di dalam folder induk (dalam kasus Anda, di dalam site-packagesfolder). Dan diimpor seperti ini:

from site-packages.toolkit.interface import interface

Semoga bermanfaat bagi Anda juga!

Sherzod
sumber
0

Di server linux coba dos2unix script_name

(hapus semua (jika ada) pycfile dengan perintah find . -name '*.pyc' -delete)

dan jalankan kembali dalam kasus ini jika Anda bekerja pada skrip di windows

Poli
sumber
0

Dalam kasus saya, saya menggunakan sys.path.insert()untuk mengimpor modul lokal dan mendapatkan module not founddari perpustakaan yang berbeda. Saya harus meletakkan di sys.path.insert()bawah impor yang dilaporkan module not found. Saya kira praktik terbaik adalah menempatkan sys.path.insert()di bagian bawah impor Anda.

Michał Zawadzki
sumber