Python hatası “ImportError: Modül adı yok”


452

Python yerel bir dizine kurulur.

Dizin ağacım şöyle:

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

Kodum burada:

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

Örneği çalıştırmak için yazıyorum python mountain.pyve kodda ben var:

from toolkit.interface import interface

Ve hatayı alıyorum:

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

Zaten kontrol ettim sys.pathve orada dizin var /site-packages. Ayrıca, __init__.py.binaraç paketi klasöründe Python için bu bir paket olduğunu belirtmek için dosya var . Ayrıca __init__.py.binörnekler dizininde bir var.

Python dosyadayken neden dosyayı bulamıyor bilmiyorum sys.path. Herhangi bir fikir? Bir izin sorunu olabilir mi? İcra iznine ihtiyacım var mı?


3
Python'dan bu dosya için okuma izniniz olup olmadığını kontrol edin. Bkz. Stackoverflow.com/a/20999950/1657225
cSn

1
Lütfen PyCharm'ın bunun bir paket olduğunu bilmesini sağlamak için dizininizi "Kaynak Kökü" olarak işaretlediğinizden emin olun.
emmmphd

Benim durumumda sorun, yeni kurulan modüllere izin olmamasıydı 755. Çünkü idi umaskmakinede oldu 0027hangi nedeniyle othersyoktu readokunamaz izni neden modülü. readİzin eklemek sorunumu düzeltti. Yükleme sonrası hedef dizinin iznini kontrol etmeye değer.
anu

URL'yi üflemeye çalışın: stackoverflow.com/questions/47887614/…
Rawan-25

belki yerel dizin adı interface (bir çakışma olmuştur).
Benyamin Jafari

Yanıtlar:


267

Orip'in gönderisine yaptığınız yorumlara dayanarak, sanırım bu oldu:

  1. __init__.pyPencerelerde düzenlediniz .
  2. Windows düzenleyicisi yazdırılamayan bir şey, belki bir satır başı (Windows'ta satır sonu CR / LF'dir; unix'te sadece LF'dir) veya belki bir CTRL-Z (windows dosya sonu) ekledi.
  3. WinSCP'yi dosyayı unix kutunuza kopyalamak için kullandınız.
  4. WinSCP şöyle düşündü: "Bunun temel metin olmayan bir şeyi var; İkili verileri belirtmek için bir .bin uzantısı ekleyeceğim."
  5. Eksik __init__.py(şimdi denir __init__.py.bin), python'un araç setini bir paket olarak anlamadığı anlamına gelir.
  6. __init__.pyUygun dizinde oluşturmak ve her şey çalışıyor ...?

50
Ayrıca, python -c 'import sys; print sys.path 'yardımcı olur - bazen kullanıcı dosyaları taranmayan bir yola yerleştirmiştir.
mikebabcock

1
WinSCP eklenmedi dışında aynı şeyi kullanıyorum .bin.
kullanıcı

9
boş bir "__init__.py" varsa aynı şey olur mu?
dietbacon

2
Aman Tanrım, sen yönet! Bu benim hikayem: 1. Düzenlenen init .py pencereler 2. O Bu yazıyı bulana kadar bir çok google bir TAB yerine boşluklar 3. eklendi! ;)
GBrian

1
Benim için sorun, yüklediğimden beri python driver.pykullanmam gerektiğinde kullanıyordum . python3 driver.pypip3
Eric Wiener

72

mu

(local directory)/site-packages/toolkit

var __init__.pymı?

İçe aktarma işleminin dizinlerinizde yürümesini sağlamak için her dizinde bir __init__.pydosya olmalıdır .


1
İyi bir nokta! Not: Python 3.3'ten beri, sys.path üzerinde paket adıyla eşleşen bir ad olan herhangi bir dizin tanınır.
PatrickT

1
bu sadece göreli yol referansları için gerekli değil mi? neden olmalı her dizin o var?
Sonic Soul

56

Bu egzersizi LPTHW'de yaptığımda çok benzer bir şeyle karşılaştım; Python'u aradığım dizinde dosyaları olduğunu fark edemedim. Ama sonunda işe yarayabiliyordum. Yaptığım ve önerdiğim, bunu denemektir:

(NOT: İlk yayınınızda, * NIX tabanlı bir makine kullandığınızı ve komut satırından bir şeyler çalıştırdığınızı varsayıyorum, bu nedenle bu tavsiye buna göre hazırlanmıştır. Ubuntu'yu çalıştırdığımdan beri, yaptığım şey bu)

1) Dizini (cd) , dosyalarınızın bulunduğu dizinin üzerindeki dizine değiştirin. Bu durumda, mountain.pydosyayı çalıştırmaya ve toolkit.interface.pyayrı dizinlerde bulunan modülü çağırmaya çalışıyorsunuz . Bu durumda, bu dosyaların her ikisinin de yollarını içeren dizine (veya her iki dosyanın yollarının paylaştığı en yakın dizine) gidersiniz. Bu durumda toolkitdizin budur.

2) Dizinde olduğunuzda, tookitkomut satırınıza şu kod satırını girin:

export PYTHONPATH=.

Bu, PYTHONPATH değerinizi "." Olarak ayarlar. Bu, temel olarak PYTHONPATH'nizin şu anda içinde bulunduğunuz dizinde (ve daha fazlasında bulunduğunuz dizinin alt dizin dallarında) aradığınız dosyaları arayacağı anlamına gelir . bu yüzden sadece geçerli dizinde bak, ama hepsi dizinlerde gelmez de ) geçerli dizinde.

3) PYTHONPATH cihazınızı yukarıdaki adımda ayarladıktan sonra, modülünüzü geçerli dizininizden ( toolkitdizin) çalıştırın. Python şimdi belirttiğiniz modülleri bulmalı ve yüklemelidir.

Bu yardımcı olur umarım. Kendimden oldukça sinirliydim.


2
Veya Windows'ta set PYTHONPATH=..
cjbarth

Bu benim için çalıştı. Ayrıca, makineleri her değiştirdiğimde mutlak bir yola güncellemek zorunda kaldığım için PYTHONPATH hayal kırıklıklarımı TAMAMEN basitleştirdi. Teşekkürler teşekkürler teşekkürler.
the_e

41

* Nix'de, PYTHONPATH özelliğinin doğru yapılandırıldığından, özellikle de bu biçime sahip olduğundan emin olun:

 .:/usr/local/lib/python

( .:Başlangıçta, geçerli dizinde de arama yapabilmesi için dikkat edin.)

Sürüme bağlı olarak başka yerlerde de olabilir:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

6
Ayrıca olabilir .:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7sürümüne bağlı vb
Nikita Volkov

Benim için modül /usr/local/lib/python3.4/dist-packages içinde ancak terminalde (ubuntu) python3 yazıp içe aktarmayı denediğimde bana izin vermiyor mevcut değil. "ImportError: x modülü yok"
user65165

Ekleme #!/usr/bin/pythonBir dosyanın sonuna de işe yarar, değil mi?
Nearoo

1
@Nearoo Bunun işe yarayacağını sanmıyorum. Artı genellikle bu shebang bir dosyanın üstüne eklenir.
Renaud

2
MacOSX'te başlangıç ​​komut dosyalarına PYTHONPATH = / usr / local / lib / python2.7 / site-paketleri eklenerek düzeltildi.
Johan Snowgoose

23

Kendi sorunumu çözdüm ve yanlış olan şeylerin ve çözümün bir özetini yazacağım:

Dosyanın tam olarak çağrılması gerekir __init__.py. Benim durumumda olduğu gibi uzantı farklıysa, .py.binPython dizinler arasında hareket edemez ve modülleri bulamaz. Dosyaları düzenlemek için vi veya nano gibi bir Linux düzenleyici kullanmanız gerekir . Bir Windows düzenleyicisi kullanıyorsanız, bu bazı gizli karakterler yazacaktır.

Etkileyen başka bir sorun, kök tarafından başka bir Python sürümünün yüklü olmasıydı, bu yüzden birisi yerel bir python yüklemesi ile çalışıyorsa, programları çalıştıran Python kurulumunun yerel Python olduğundan emin olun. Bunu kontrol etmek için sadece yapın which pythonve yürütülebilir dosyanın yerel dizininizde olup olmadığını görün. Değilse yolu değiştirin, ancak yerel Python dizininin diğer Python'dan önce olduğundan emin olun.


Aldığım bir sorun, bir modülün (root) pip tarafından sadece kök kullanıcı ile ona erişmek için kurulmuş olmasıydı, bu yüzden programı çalıştıran kullanıcı görmedi.
Jānis Elmeris

@ JānisElmeris yukarıdaki yorum hakkında daha fazla ayrıntı verebilir misiniz, sanırım ben de benzer bir hatayla karşılaşıyorum. Benim sahip __init__.pydosyalar ilgili dizine yerleştirilir ama elle kullanarak bir paket yüklü setup.py. Yeni bir paket kurmak ithalatı nasıl engelleyebilir.
Krishna Oza

@darth_coder, üzgünüm, bu altı yıl önceydi ve davayı hatırlamıyorum. Ayrıca, son zamanlarda Python ile çok az uğraşıyorum. Yazdıklarımdan, diğer kullanıcıların daha önce sahip oldukları erişime sahip olmaması için izinleri değiştiren bir paketi kök olarak yüklediğimi düşünebilirim.
Jānis Elmeris

19

kolay bir çözüm python -m pip install <library-name>yerine pip install <library-name> yönetici kısıtlamaları durumunda sudo kullanabilirsiniz yerine kullanarak modülü yüklemek için


2
python -mÖnünde neler başarıyor pip install?
sporc

1
@sporc - -m komut satırı bayrağını kullandığınızda, Python sizin için bir modül veya paket alır ve bunu komut dosyası olarak çalıştırır. -M bayrağını kullanmadığınızda, adlandırdığınız dosya yalnızca komut dosyası olarak çalıştırılır.
Tony Ciccarone

Bu cevabın wrt python -m pip...çalıştığını söylemeye çalıştığından emin değilim , ama pip...etmedi: aslında aynı pythondizinde olduklarını varsayarak etkili bir şekilde aynı şeyler . Muhtemelen, gözlemlenen durum, bağımsız pipprogramın bazı eski python sürümlerinde mevcut olmamasıydı (ancak şimdi en son 2.7 ve 3.x'te). Bu durumda, pythonyerel bir sanal ortamda idi ve pipöyle değildi, bu yüzden python -m pip installyerel sanal ortamda kurulacaktı, oysa pipsistem pythonuna kurmaya çalışacaktı (ve sudo w / o sudo). Her durumda, mantıklı değil.
michael

17

Bir dizini paket olarak işaretlemek için adlı bir dosyaya ihtiyacınız vardır __init__.py, bu yardımcı olur mu?


Zaten bir dosya adı verilen var init ben adını değiştirirseniz, .py.bin init ", hat 1 '/__init__.py programları', 'demo'] ^ SyntaxError:, .py sonra bu hatayı alıyorum geçersiz sözdizimi
Eduardo

Ne var init .py? Bunu sorunuzun bir parçası olarak gönderin.
S.Lott

Hiçbir şey yok, boş, İndirdiğim paketin içindeydi, dosyaya bir şey yazmam gerekiyor mu ?.
Eduardo

@ S.Lott: init .py'nize bir şey koymanıza gerek yok değil mi?
igorgue

1
@Eduardo. Sizin init .py hata alır. Ve boş olduğunu söylüyorsun. Uzlaşmak zor. Ve init .py.bin olarak adlandırılamaz - Python bu dosyayı yok sayar. Tipik olarak, içinde hiçbir şey olamaz.
S.Lott

16

PyCharm(JetBrains paketinin bir parçası) kullanarak komut dosyası dizininizi Kaynak olarak tanımlamanız gerekir:
Right Click > Mark Directory as > Sources Root


12

Bu cevabı okuyorsunuz __init__.py, doğru yerde olduğunuzu, tüm bağımlılıkları kurduğunuzu ve hala aldığını söylüyor ImportError.

Ben benzer bir sorunla karşı karşıya kaldım benim program PyCharm kullanarak koştu ama terminalden çalıştırdığınızda yukarıdaki hata iyi çalışacaktı. Daha fazla kazdıktan sonra PYTHONPATH, proje dizini için bir giriş olmadığını öğrendim . Yani, PYTHONPATHher ithalat ifadesi PyCharm üzerinde çalışıyor, ancak terminalden ayarlamıyorum :

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

Bunu kullanarak başka bir yol var sys.path:

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

Projenizin aranmasını istediğiniz sırayla insert / append komutunu kullanabilirsiniz.


12

Benim için bu gerçekten aptalca bir şeydi. Kütüphaneyi kullanarak kurdum pip3 installama programımı python program.pyaksine çalıştırıyordum python3 program.py.


1
Vaov ! Bu benim için de işe yaradı.
JavaDeveloper

1
Günümü kurtardın.
Aymen

7

Evet. __init__.pyPaketi başlatan dosya olan dosyayı içeren dizine ihtiyacınız vardır . Burada, bir göz bu .

__İnit__.py dosyaları, Python'un dizinleri paket olarak ele almasını sağlamak için gereklidir; bu, dize gibi ortak bir ada sahip dizinlerin, daha sonra modül arama yolunda gerçekleşen geçerli modülleri yanlışlıkla gizlemesini önlemek için yapılır. En basit durumda, __init__.py boş bir dosya olabilir, ancak paket için başlatma kodunu yürütebilir veya daha sonra açıklanacak __all__ değişkenini ayarlayabilir.


6
  1. __ init__.py dosyasının, içe aktarmakta olduğunuz dosyanın bulunduğu dizinde olması gerekir.
  2. Aynı ada sahip ve PYTHONPATH üzerinde yapılandırılmış 2 klasörden bir dosya olan bir dosyayı almaya çalışamazsınız.

ör .: / etc / çevre

PYTHONPATH = $ PYTHONPATH: / opt / klasor1: / opt / klasor2

/ Opt / klasor1 / foo

/ Opt / klasor2 / foo

Ve eğer foo dosyasını içe aktarmaya çalışıyorsanız, python hangisini istediğinizi bilmeyecektir.

ithalatçıdan ... >>> ithalatçı: foo adlı modül yok


5

Benim görüşüm:

resim açıklamasını buraya girin

Tükürmek:

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

Bu beni cehenneme karıştırdı - çirkin syspath kesmek öneren mesajlar ve mesajlar geçti (benim gördüğüm __init__.pygibi tüm orada). Peki oyun / oblivion.py ve oyun / oblivion oldukça yararsız "RecordGroups adlı modül yok" tüküren python kafa karıştırıcı olduğu ortaya çıkıyor. Bu (aynı ad) davranışı belgeleyen bir çözüm ve / veya bağlantılar ilgilenen olurdu -> DÜZENLEME (2017/01/24) - bakabilirsiniz Aynı Adla What If I have a Modülü ve Paketi? İlginçtir ki, normalde paketler önceliklidir, ancak görünüşe göre fırlatıcı bunu ihlal etmektedir.

EDIT (2015.01.17): Burada disseke edilmiş özel bir fırlatıcı kullandığımızdan bahsetmedim .


daha çok yol kapalıymış gibi. game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py Kullanmak için python kodunuzu ekleyerek bunu düzeltmek isteyebilirsiniz:game.oblivion.patchers.RecordGroups
Dwight Spencer

@DwightSpencer: "RecordGroups" i içeri aktardığımdan eminim game.oblivion.__init__.pyama bunu kontrol etmek zorunda kalabilirim
Mr_and_Mrs_D

4

Linux: İçe aktarılan modüller /usr/local/lib/python2.7/dist-packages içinde bulunur

C derlenmiş bir modül kullanıyorsanız, sonra .so dosyasını chmod unutmayın sudo setup.py install.

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

3

Benim durumumda, ben hata ayıklamak için bağlanıyor oldu python& boost::Python, FooLib_d.pydsadece uzantısı değil, gerektirir FooLib.pyd; dosyayı yeniden adlandırmak veya CMakeLists.txtözellikleri güncellemek hatayı düzeltti.


3

Yukarıda verilen ancak başarısız olan tüm yöntemleri denediyseniz, modülünüz yerleşik modülle aynı ada sahip olabilir . Veya, yüksek önceliğe sahip bir klasörde aynı ada sahip bir modülsys.path daha modül.

Hata ayıklamak için from foo.bar import bazşikayetlerinizi söyleyin ImportError: No module named bar. Olarak değiştirilir import foo; print foo, yolu gösterilir foo. Beklediğin bu mu?

Değilse, mutlak içe aktarmaları yeniden adlandırın fooveya kullanın .


1
Benim için bu sonuç verir ImportError: No module named foo.
alex

3

Benim sorunum __init__.pyaslında ana dizini eklemek gerektiğinde PYTHONPATH dosya ile dizini ekledi oldu .


3

Hala bu sorunu yaşayan herkese. İnanıyorum ki Pycharm ithalatla karışıyor. Benim için, 'isim alanından bir şey içe aktar' yazdığımda, önceki satır kırmızı renkle vurgulanır, bir hata olduğunu gösterir, ancak çalışır. Ancak '' .namespace import bir şeyden '' altı çizilmez, aynı zamanda çalışmaz.

Deneyin

try:
    from namespace import something 
except NameError:
    from .namespace import something

1
Birincisi python 2 sözdizimi, ikincisi python 3'tür.
Tanya Branagan

2

Yazarak sorunumu düzelttim print (sys.path)ve temiz bir yüklemeye rağmen python'un eski paketleri kullandığını öğrendim. Bu python silindiğinde otomatik olarak doğru paketler kullanılır.


2

Benim durumumda, çünkü PyCharm'ı kullanıyorum ve PyCharm proje klasöründeki her proje için bir 'venv' oluşturuyor, ancak bu sadece bir mini piton env. Gereksinim duyduğunuz kütüphaneleri Python'a kurmuş olsanız da, özel projeniz 'venv'de kurmuş olsanız da mevcut değildir. PyCharm'da 'ImportError: xxxxxx adında bir modül' oluşmamasının gerçek nedeni budur. Bu sorunu gidermek için, aşağıdaki adımları izleyerek proje özel ortamınıza kitaplık eklemeniz gerekir:

  • PyCharm'da, 'Dosya' -> Ayarlar menüsünden
  • Ayarlar iletişim kutusunda Proje: XXXProject-> Proje Tercümanı
  • "Ekle" düğmesini tıklayın, size 'Kullanılabilir Paketler' iletişim kutusu gösterilir
  • Kitaplığınızda arama yapın, 'Paketi Yükle'yi tıklayın
  • Daha sonra, ihtiyacınız olan tüm paket proje özel 'venv' klasörüne yüklenecektir.

Ayarlar iletişim kutusu

Zevk almak.


0

Aynı sorunu yaşadıktan sonra çözümümün projemdeki tüm pycdosyaları silmek olduğunu gördüm, bu önbelleğe alınmış dosyalar bir şekilde bu hataya neden olmuş gibi görünüyor.

Bunu yapmanın en kolay yolu, Windows Gezgini'nde proje klasörüne gitmek ve aramak *.pyc, sonra hepsini ( Ctrl+ A) seçip silmek ( Ctrl+ X).

Sadece belirli bir pycdosyayı silerek sorunlarımı çözmüş olabilirim ama bunu hiç denemedim


0

Aynı problemle karşılaştım Import error. Ayrıca kütüphane% 100 doğru şekilde kuruldu. Sorunun kaynağı, python'un (anaconda paket) PC 3 sürümümün yüklü olmasıydı. Bu nedenle kütüphane doğru yere hayır kuruldu. Bundan sonra, IDE PyCharm'ımda python'un uygun sürümüne geçtim.


0

Aynı hatayla karşılaştım. Birisinin senaryomla aynı klasörde bir klasör oluşturması, adı başka bir yerden içe aktardığım bir modülle çakışmasından kaynaklandı. Harici modülü almak yerine, beklenen modülleri içermeyen bu klasörün içine baktı.


0

Aynı sorunu yaşadım (Python 2.7 Linux), çözümü buldum ve paylaşmak istiyorum. Benim durumumda aşağıdaki yapı vardı:

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

'Main.py' de tüm kombinasyonları başarısızlıkla denemiştim:

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 ...

Çözüm düşündüğümden çok daha basitti. "Kitapçık" klasörünü "kitapçık" olarak yeniden adlandırdım ve hepsi bu. Şimdi Python 'main.py' kodunu kullanarak Question sınıfını normal olarak içe aktarabilir:

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

Buradan 'kitapçık' gibi Paket Adlarının (klasörlerin) küçük harflerden başlaması gerektiği sonucuna varabilirim, aksi halde Python bunu Sınıf adları ve Dosya adları ile karıştırır.

Görünüşe göre, bu senin problemin değildi, ama John Fouhy'nin cevabı çok iyi ve bu konu bu soruna neden olabilecek neredeyse her şeye sahip. Yani, bu bir şey daha ve umarım bu belki başkalarına yardımcı olabilir.


0

Benim durumumun altında gerçek paket yerine package.egg klasörünün yolunu ekliyordum. Paketi en üst seviyeye kopyaladım ve işe yaradı.


0

Bu benim için çalıştı: __init__.pyAna klasörde (sizin durumunuzda, site-packagesklasörün içinde ) dosya oluşturuldu . Ve böyle ithal:

from site-packages.toolkit.interface import interface

Umarım sizin için de yararlı olacaktır!


0

Linux sunucusunda deneyin dos2unix script_name

( pyckomutla tüm dosyaları (varsa) kaldır find . -name '*.pyc' -delete)

ve pencerelerde komut dosyası üzerinde çalışmışsanız yeniden çalıştırın


0

Benim durumumda, sys.path.insert()yerel bir modülü almak için kullanıyordum ve module not foundfarklı bir kütüphaneden alıyordum . sys.path.insert()Bildirilen ithalatın altına koymak zorunda kaldım module not found. Sanırım en iyi uygulama, sys.path.insert()ithalatınızın en altına inmek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.