Python komut dosyasını çalıştırmaya çalışırken “ImportError: Modül adı yok”


144

Diğer şeylerin yanı sıra bir python betiği başlatan bir betik çalıştırmaya çalışıyorum. ImportError: ... adlı bir modül almıyorum, ancak ipython'u başlatır ve aynı modülü yorumlayıcı aracılığıyla aynı şekilde içe aktarırsam modül kabul edilir.

Neler oluyor ve nasıl düzeltebilirim? Python'un PYTHONPATH'ı nasıl kullandığını anlamaya çalıştım ama tamamen kafam karıştı. Herhangi bir yardım büyük mutluluk duyacağız.


4
Daha fazla bilgi vermeniz gerekiyor. "Bir komut dosyası çalıştır" derken, bir kabuk komut dosyası mı demek istediniz? Hangi modülü içe aktaramazsınız? Bu modül nerede bulunuyor? Senaryonuz nerede?
BrenBarn

2
"Neler olup bittiğine" kesin bir cevap vermek isterseniz, -vseçenekle python'u başlatın ve python'un içe aktardığınız modülleri nerede bulduğunu (veya bulamadığını) göreceksiniz.
FatalError

Neyi içe aktarmaya çalışıyorsunuz? İki python betiği aynı dizinde mi?
Mart'ta pynovice

2
Lütfen bize çalıştırdığınız kodu, yığın izlemenin tam metnini ve hatayı oluşturmak için attığınız tam adımları verin. Kesin sorunun ne olduğunu bilmediğimizde yardımcı olmak oldukça zor.
MattDMo

5
Sorunun ilk sorulmasından 4 yıl sonra bile, birçok kullanıcı deneyiminin bir sorun olduğunu düşünüyorum.
CodeOcelot

Yanıtlar:


183

Bu sorun, IPython yorumlayıcısı komut satırının geçerli yolunuzu kullanma biçiminden ( ayrı bir işlemin (IPython not defteri, dış işlem vb.) Karşılaştırması nedeniyle ortaya çıkar. IPython, yalnızca sys.path dosyanızda değil, geçerli çalışma dizininizde bulunan içe aktarılacak modülleri arayacaktır. Komut satırından bir tercüman başlatırken, içinde bulunduğunuz dizin ipython'u başlattığınız dizindir. Çalıştırırsanız

import os
os.getcwd() 

bunun doğru olduğunu göreceksin.

Ancak, bir ipython not defteri kullandığınızı, çalıştırdığınızı os.getcwd()ve geçerli çalışma dizininizin, not defterine ipython_notebook_config.py dosyanızda (genellikle c.NotebookManager.notebook_dirayarı kullanarak ) çalışmasını söylediğiniz klasör olduğunu varsayalım .

Çözüm, python yorumlayıcısına modülünüzün yolunu sağlamaktır. En basit çözüm bu yolu sys.path listenize eklemektir. Not defterinizden önce şunları deneyin:

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

import module-of-interest

Bu işe yaramazsa, içe aktarma yolu ile ilgisi olmayan ellerinizde farklı bir sorun vardır ve sorununuz hakkında daha fazla bilgi vermelisiniz.

Bunu çözmenin daha iyi (ve daha kalıcı) yolu , tercümana python paketleri / modülleri aramak için ek dizinler sağlayan PYTHONPATH'nizi ayarlamaktır . PYTHONPATH'ın global bir var olarak düzenlenmesi veya ayarlanması işletim sistemine bağlıdır ve burada Unix veya Windows için ayrıntılı olarak ele alınmaktadır .


1
PSA: Jupyter-notebook'ta bu hatayı aldığınız için bu SO sorusuna geldiyseniz, aşağıya bakın, stackoverflow.com/a/27944947/127971 Maalesef, soru tek bir cevap için yeterli değil.
michael

@michael bu sorunun genel olarak Python modüllerini içe aktarmasıyla ilgilidir; dunder init.py dosyası, yorumlayıcı dizinleri içe aktarmak, not almak veya not etmek için dizin aradığında gereklidir. Not defteri yorumlayıcısı çalışma dizini ve PYTHONPATH ayarı ile ilgili yukarıdaki cevap doğrudur.
BoltzmannBrain

Sorunun ifadesi nedeniyle birden fazla doğru cevap olacağını söyledim. Bu cevap ima etmiyorum değil doğru. Ama jupyter-notebook kullanıyorsanız, dosyaya dokunacaksınız __init_.py, değil mi? ... ve, değil değiştirmek isteyeceksin PYTHONPATHne de çağrı sys.path.appendonlar da doğru olsa bile, (doğru?). Yani, içinde onlarca dizin w / onlarca dizin var ve ben hepsini yol eklemek için - ya da bir dizin olsa bile, diğer kullanıcıların jupyter yapılandırma dosyasına bekliyoruz.
michael

16

__init__.pyPython projesini çalıştırırken hata gösteren klasörün altındaki adla boş bir python dosyası oluşturun .


1
' İnit.py ' ile '_ init_ .py' demek istediniz , değil mi? _ İnit_ .py dosyasını boş bir dosya olarak oluşturdum ve benim için çalıştı. Çok teşekkürler. Peki bu neden gerekli? Daha önce ipython defter ile aynı dizinde bir python betiği vardı ve alma iyi çalışıyordu.
Eduardo Reis

3
aslında init .py, ilgili konumda bir paket bulunduğunu belirtmek için python'u belirtmek için kullanılır. ancak altında oluşturduğunuz her şeyi yalnızca alt modüller bulur. ' init .py' oluşturmazsanız , python içinde bir paket olduğunu bilmiyor demektir. Örneğin: bunun için "Myfolder.Mypackage import Mymodules" den, burada bazı paketlerin var olduğunu söyleyecek python'u belirtmek için init .py'yi başlatmalısınız . yoksa bilmiyor.
Mohideen bin Muhammed

1
Evet, mükemmel cevap. Bu python 2.7'de gerekli, ancak 3
Agape Gal'lo

bu benim için python 3'teki sorunu düzeltti.
Rick,

benim için de sorunu düzeltti - jupyter notebook kullanarak, ipynb dosyasının alt dizininde python kaynağı ile; örneğin, foo.ipynbkullanarak bar/baz.py, bar/__init__.pydizüstü bilgisayarın kullanabilmesi için boş dosya ekleyinfrom bar.baz import MyClass
michael

13

Her ikisinin de aynı yorumlayıcıyı kullandığından emin olun. Bu bana Ubuntu'da oldu:

$ 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]

Ve sys.pathiki tercüman arasında farklıydı. Düzeltmek için Python 3.3'ü kaldırdım.


bir sürü python ile ilgili şeyler yüklemek için miniconda kullandım da tam olarak bu sorunu var. Birlikte verilen ubuntu python 2.7, miniconda python 2.7'den farklıdır. Bu cevap sorunu
çözmeme

4
Bu benim sorunumdu. Python 2.7.11'e yükselttim ama iPython interaktif kabuğum hala 2.7.5 kullanıyordu. Sadece pip install --upgrade ipythonen son sürümü almak için çalıştırmak gerekiyordu ve daha sonra varsayılan olarak otomatik olarak 2.7.11 kullanılır.
Abundnce10

IPython'um 7.4.0, ancak böyle bir Python sürümü yok.
aderchox

@aderchox Tercüman sürümünü edinmek için bunu ipython'da çalıştırın:import sys; sys.version
z0r

7

Bunun ana nedeni Python ve IPython'un sys.path'lerinin farklı olmasıdır.

Lütfen lucypark bağlantısına bakın , çözüm benim durumumda çalışır. Opencv tarafından yüklendiğinde olur

conda install opencv

Ve iPython'da içe aktarma hatası var, Bu sorunu çözmek için üç adım var:

import cv2
ImportError: ...

1. Python ve iPython'daki yolu aşağıdaki komutla kontrol edin

import sys
sys.path

Python ve Jupyter'den farklı sonuçlar bulacaksınız. İkinci adım, sadece kullanınsys.path.append kaçırılan yolu denemek ve hata ile düzeltmek için .

2. Geçici çözüm

İPython'da:

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

ImportError:..sorun çözüldü

3. Kalıcı çözüm

Bir iPython profili oluşturun ve ilk eki ayarlayın:

Bas kabuğunda:

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

Vi'de dosyaya ekleyin:

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

YAPILAN


'ipython profili oluştur' .... Evet! Bu, her dosyanın (yuk) başlangıcında dağınık sys.path deyimlerine başvurmadan, PATH ve PYTHONPATH ... ortamından okumayan jupyter not defterine hitap eden tek (kalıcı) çözümdür. teşekkür ederim @ jesse.
JohnL_10

6

Yapmak sys.path.append('my-path-to-module-folder')işe yarayacaktır, ancak modülü her kullanmak istediğinizde IPython'da bunu yapmaktan kaçınmak export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"için ~/.bash_profiledosyanıza ekleyebilirsiniz .


2

İpython'u kurmadan önce easy_install ile modüller kurdum; söylesudo easy_install mechanize .

İpython'u yükledikten sonra, ipython'un modülleri tanıması için easy_install komutunu yeniden çalıştırmam gerekiyordu.


2

Benzer bir sorun vardı, python3yerine arayarak düzeltildi python, benim modülleri Python3.5 idi.


2

Komut satırından çalıştırıyorsanız, bazen python yorumlayıcısı modüllerin aranacağı yolun farkında değildir.

Projemin dizin yapısı aşağıdadır:

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

Komutun altında koşuyordum:

>> cd project

>> python tests/my_test.py

Yukarıdaki komutu çalıştırdıktan sonra hata aldım

no module named lib

lib my_test.py dosyasına aktarıldı

sys.path yazdırdım ve üzerinde çalıştığım proje yolunun sys.path listesinde bulunmadığını anladım

benim kod başında aşağıdaki kodu ekledi 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)

Bunu çözmenin iyi bir yolu olup olmadığından emin değilim ama evet benim için işe yaradı.


Komut dosyasını her zaman aynı konumdan çalıştırırsanız bu çalışır. Aksi takdirde, os.getcwd()komut dosyasının çalıştırıldığı dizini değil, komut dosyasının çalıştırıldığı dizini aldığından beri sorunlarla karşılaşırsınız .
Nathan Arthur

1

Ben böyle giderdim:

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


0

Bu tutarsızlığın başka bir kaynağını daha buldum:

Ipython'u hem yerel olarak hem de sanal olarak sanal olarak yükledim. Benim sorunum, ipython ile yeni yapılmış bir virtualenv içinde, sanal iv'deki python ve ipython'dan (2.7.x ve 3.5.x) farklı bir versiyon olan sistem ipython'un alınması ve hilarity'nin olmasıydı.

Ben bir ikili olacak bir şey yüklerken yapmak için akıllı bir şey , doğru python / ipython aldı almak böylece kullandığınız kabuk ne olursa olsun yourvirtualenv/binhemen çalıştırmak rehashveya benzer olduğunu düşünüyorum. (Montaj pipsonrası uygun kanca olup olmadığını kontrol etmeliyiz ...)


0

Komut dosyası olmadan çözüm:

  1. Spyder'ı açın -> Araçlar -> PYTHONPATH yöneticisi
  2. "Yol Ekle" yi tıklayarak Python yolları ekleyin. Örnek: 'C: \ Kullanıcılar \ Kullanıcı \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ site-Packages'
  3. Diğer programların (örn. Jupyter Notebook) 2. adımda ayarlanan pythonyollarını kullanmasına izin vermek için "Senkronize et ..." seçeneğini tıklayın.
  4. Açıksa Jupyter'ı yeniden başlatın

0

Bu muhtemelen sisteminizde kurulu farklı python sürümlerinden kaynaklanmaktadır , örneğin python2 veya python3 .

Komutunu çalıştırın $ pip --versionve $ pip3 --versionhangi kontrol etmek Pip de arasındadır Python 3 kat . Örneğin, aşağıdaki gibi sürüm bilgilerini görmelisiniz:

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

Sonra example.pykomut dosyasını aşağıdaki komutla çalıştırın

$ python3 example.py

0

Dizinle bana oldu utils. Bu dizini olarak almaya çalışıyordum:

from utils import somefile

utilszaten python'da bir paket. Sadece dizin adınızı farklı bir şeye değiştirin ve gayet iyi çalışmalıdır.


0

Bu tür hatalar büyük olasılıkla python sürüm çakışmaları nedeniyle oluşur. Örneğin, uygulamanız yalnızca python 3'te çalışıyorsa ve python 2'niz varsa, hangi sürümü kullanacağınızı belirtmek daha iyidir. Örneğin kullanın

python3 .....

onun yerine

python


0

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


-1

Çıkarın pathlibve yeniden takın. sitepackagesKlasördeki pathlib dosyasını silin ve pip komutunu kullanarak pathlib paketini yeniden yükleyin:

pip install pathlib
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.