2013-03-20 122 views
78

我試圖運行一個腳本,它啓動了一個python腳本。我得到一個ImportError:No module named ...,但是,如果我通過解釋器啓動ipython並以相同的方式導入相同的模塊,那麼該模塊將被接受。嘗試運行Python腳本時出現「ImportError:No module named」

這是怎麼回事,我該如何解決?我試圖瞭解python如何使用PYTHONPATH,但我完全困惑。任何幫助將不勝感激。

+4

您需要提供更多信息。當你說「運行一個腳本」,你的意思是一個shell腳本?你不能導入哪個模塊?該模塊位於何處?你的腳本在哪裏? – BrenBarn 2013-03-20 03:11:42

+2

如果你想得到「正在發生什麼」的確定性答案,用'-v'選項啓動python,你會看到python在哪裏(或不在)找到你導入的模塊。 – FatalError 2013-03-20 03:13:42

+0

你想要導入什麼?兩個python腳本在同一個目錄中嗎? – pynovice 2013-03-20 03:50:08

回答

100

這個問題的出現是由於在命令行解釋器的IPython使用您當前的路徑與方式的方式單獨的進程確實(可以是一個IPython的筆記本電腦,外部進程等)。 IPython將查找不僅可以在您的sys.path中找到的模塊,而且還可以在當前的工作目錄中找到這些模塊。當開始在命令行解釋器,你在運行當前目錄是您在啓動IPython中的相同。如果你運行

import os 
os.getcwd() 

你會看到這是真的。

但是,假設你使用的是筆記本的IPython,運行os.getcwd()和當前的工作目錄是不是在你告訴筆記本從您ipython_notebook_config.py文件進行操作(通常使用c.NotebookManager.notebook_dir設置)的文件夾。

解決方案是爲python解釋器提供路徑到你的模塊。最簡單的解決方案是將該路徑追加到sys.path列表中。在你的筆記本,第一次嘗試:

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

import module-of-interest 

如果不工作,你已經有了一個不同的問題,在您的手中無關的路徑來導入,你應該提供問題的詳細信息。

更好(更永久的)的方式來解決這個問題是設置PYTHONPATH,它提供瞭解釋與其他目錄中查找Python軟件包/模塊。編輯或設置PYTHONPATH作爲全局變量取決於操作系統,在此處對UnixWindows進行了詳細討論。

+1

謝謝。解決了我的問題。 – Aditya 2015-08-20 10:28:23

+0

PSA:如果你已經來到這個SO問題,因爲你在jupyter-notebook中出現這個錯誤,那麼請看下面,https://stackoverflow.com/a/27944947/127971不幸的是,這個問題還不夠具體一個答案。 – michael 2017-07-15 19:45:16

+0

@michael這個答案是關於在一般情況下導入Python模塊的;當解釋器搜索要導入的模塊的目錄時,dunder init.py文件是必需的,或者不是。以上關於筆記本解釋器工作目錄和設置PYTHONPATH的答案是正確的。 – BoltzmannBrain 2017-07-15 19:58:02

2

在安裝ipython之前,我通過easy_install安裝了模塊;說sudo easy_install mechanize

安裝ipython後,我不得不重新運行ipython的easy_install來識別模塊。

4

sys.path.append('my-path-to-module-folder')的工作,但要避免要使用該模塊每次都做到這一點在IPython中,你可以添加export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"~/.bash_profile文件。

10

只需在運行python項目時顯示錯誤的文件夾下創建一個名稱爲__init__.py的空python文件。

+0

'__init.py__'表示'\ __ init \ __。py',對吧? 我創建了\ __ init \ __。py作爲一個空文件,它爲我工作。非常感謝。 但爲什麼這需要?在與我的ipython筆記本相同的目錄中有一個python腳本並且導入工作正常之前, – 2015-11-18 12:49:32

+1

是的,正好@EduardoReis ,.實際上我只把__init__.py,但我不知道爲什麼利益衝突不支持它。 – 2015-11-19 06:38:37

+2

實際上,__init__.py用於指示python以指示在該相應位置包含某個包。那麼只有它會發現無論你在它下面創建的子模塊。如果你不創建'_init_.py'意味着python不知道里面有一些軟件包。例如:從「Myfolder.Mypackage import Mymodules」這個例如,你應該啓動__init__.py來指示python告訴這裏有一些包。否則它不知道。 – 2015-11-19 06:48:15

8

確保它們都使用相同的解釋器。這發生在我在Ubuntu:

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

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

而且sys.path是兩種解釋之間的不同。爲了解決它,我刪除了Python 3.3。

+0

已經使用miniconda安裝了一堆python相關東西我也得到了這個問題。捆綁的ubuntu python 2.7與miniconda python 2.7不同。這個答案允許我解決問題 – bph 2016-02-24 21:51:10

+3

這是我的問題。我已升級到Python 2.7.11,但我的iPython交互式shell仍在使用2.7.5。我只需要運行'pip install --upgrade ipython'來獲取最新版本,然後默認自動使用2.7.11。 – Abundnce10 2016-05-03 17:46:13

0

有類似的問題,通過調用python3而不是python修復它,我的模塊在Python3.5。

3

主要原因是Python和IPython的sys.paths不同。

請參閱lucypark link,解決方案適用於我的情況。它恰巧

conda install opencv

安裝OpenCV的時候,得到了在IPython中導入錯誤,有三個步驟來解決這個問題:

import cv2 
ImportError: ... 

1.檢查路徑在Python和IPython都用下面的命令

import sys 
sys.path 

你會發現它們是不同的結果。第二步,只需使用sys.path.append通過嘗試錯誤修復錯過的路徑。

2.臨時解決

在IPython中:

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

ImportError:..問題解決

3.永久性的解決方案

創建一個IPython的個人資料,並設置初始追加:

在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 

在六,附加到文件:

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

DONE

-1

刪除pathlib並重新安裝。

刪除sitepackages文件夾中的pathlib,並使用pip命令重新安裝pathlib軟件包。

PIP安裝pathlib

-1

這是我如何固定它:

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

我發現這種差異的又一來源:

我已經IPython都安裝在本地和常用的virtualenvs。我的問題是,在新制作的帶有ipython的virtualenv中,系統ipython被選中,這是與virtualenv(2.7.x和3.5.x)中的python和ipython不同的版本,並且隨之而來的是歡快。

我認爲在安裝yourvirtualenv/bin中的二進制文件時要做的事情是,立即運行rehash或類似的shell,以便正確使用python/ipython。 (請檢查是否有合適的pip安裝後掛鉤...)

1

如果您是從命令行運行它,有時python解釋器不知道在哪裏查找模塊。

下面是我的項目的目錄結構:

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

我運行下面的命令:

>> cd project 

>> python tests/my_test.py 

上面的命令運行後我得到了以下錯誤

no module named lib 

LIB是在my_test.py中導入

我打印sys.path中,並計算出項目我工作的這條路是不是在sys.path中列出可用

我添加下面的代碼在我的劇本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) 

我不知道這是否是解決它的一個很好的方式,但是它確實爲我工作。

相關問題