[英]Python error "ImportError: No module named"
Python 安裝在本地目錄中。
我的目錄樹如下所示:
(local directory)/site-packages/toolkit/interface.py
我的代碼在這里:
(local directory)/site-packages/toolkit/examples/mountain.py
為了運行這個例子,我寫python mountain.py
,在我的代碼中:
from toolkit.interface import interface
我得到了錯誤:
Traceback (most recent call last):
File "mountain.py", line 28, in ?
from toolkit.interface import interface
ImportError: No module named toolkit.interface
我已經檢查了sys.path
並且我有目錄/site-packages
。 此外,我在工具包文件夾中有文件__init__.py.bin
向 Python 表明這是 package。 我在示例目錄中也有一個__init__.py.bin
。
我不知道為什么 Python 在sys.path
中找不到文件。 有任何想法嗎? 會不會是權限問題? 我需要一些執行權限嗎?
根據您對 orip 帖子的評論,我想這就是發生的事情:
__init__.py
。__init__.py
(現在稱為__init__.py.bin
)意味着 python 不將工具包理解為一個包。__init__.py
並且一切正常...?做
(local directory)/site-packages/toolkit
有一個__init__.py
嗎?
要使導入遍歷您的目錄,每個目錄都必須有一個__init__.py
文件。
當我在 LPTHW 中做這個練習時,我遇到了非常相似的事情。 我永遠無法讓 Python 識別出我調用的目錄中有文件。 但我最終能夠讓它工作。 我所做的,以及我推薦的,是試試這個:
(注意:從您最初的帖子中,我假設您使用的是基於 *NIX 的機器並從命令行運行,因此此建議是針對此量身定制的。由於我運行 Ubuntu,這就是我所做的)
將目錄 (cd) 更改為文件所在目錄之上的目錄。 在這種情況下,您嘗試運行mountain.py
文件,並嘗試調用位於不同目錄中的toolkit.interface.py
模塊。 在這種情況下,您將轉到包含這兩個文件的路徑的目錄(或者換句話說,這兩個文件的路徑共享的最近的目錄)。 在這種情況下是toolkit
目錄。
當您在toolkit
目錄中時,在命令行中輸入這行代碼:
export PYTHONPATH=.
這會將您的 PYTHONPATH 設置為“。”,這基本上意味着您的 PYTHONPATH 現在將在您當前所在的目錄中查找任何被調用的文件(更重要的是,在您所在目錄的子目錄分支中。因此,它不僅會查看當前目錄,還會查看當前目錄中的所有目錄)。
在上述步驟中設置好 PYTHONPATH 后,從當前目錄( toolkit
目錄)運行模塊。 Python 現在應該找到並加載您指定的模塊。
希望這可以幫助。 我自己對此感到非常沮喪。
在 *nix 上,還要確保 PYTHONPATH 配置正確,尤其是它具有以下格式:
.:/usr/local/lib/python
(注意開頭的.:
,這樣它也可以搜索當前目錄。)
它也可能位於其他位置,具體取決於版本:
.:/usr/lib/python
.:/usr/lib/python2.6
.:/usr/lib/python2.7 and etc.
您正在閱讀此答案,表明您的__init__.py
位於正確的位置,您已經安裝了所有依賴項,並且仍然收到ImportError
。
我遇到了類似的問題,除了我的程序在使用 PyCharm 運行時運行良好,但當我從終端運行時出現上述錯誤。 進一步挖掘后,我發現PYTHONPATH
沒有項目目錄的條目。 所以,我設置PYTHONPATH
每個Import 語句在 PyCharm 上工作,但不是從終端:
export PYTHONPATH=$PYTHONPATH:`pwd` (OR your project root directory)
還有另一種方法可以使用sys.path
來做到這一點:
import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')
您可以根據您希望搜索項目的順序使用插入/追加。
使用PyCharm
(JetBrains 套件的一部分),您需要將腳本目錄定義為 Source:
Right Click > Mark Directory as > Sources Root
對我來說,這是一件非常愚蠢的事情。 我使用pip3 install
安裝了該庫,但將我的程序作為python program.py
而不是python3 program.py
運行。
我自己解決了自己的問題,我會寫一個錯誤的總結和解決方法:
該文件需要准確地調用__init__.py
。 如果擴展名不同,例如在我的情況下為.py.bin
,則 Python 無法在目錄中移動,然后找不到模塊。 要編輯文件,您需要使用 Linux 編輯器,例如vi或nano 。 如果您使用 Windows 編輯器,這將寫入一些隱藏字符。
另一個影響它的問題是我安裝了另一個 Python 版本,所以如果有人正在使用本地安裝的 python,請確保運行程序的 Python 安裝是本地 Python。 要檢查這一點,只需執行which python
,並查看可執行文件是否是您本地目錄中的那個。 如果不是,請更改路徑,但請確保本地 Python 目錄在其他 Python 之前。
要將目錄標記為包,您需要一個名為__init__.py
的文件,這有幫助嗎?
一個簡單的解決方案是使用python -m pip install <library-name>
而不是pip install <library-name>
安裝模塊,在管理員限制的情況下可以使用 sudo
對於所有仍然有這個問題的人。 我相信 Pycharm 與導入混淆了。 對我來說,當我寫“從命名空間導入某些東西”時,前一行用紅色下划線表示,表示存在錯誤,但有效。 但是,''from .namespace import something' 沒有下划線,但也不起作用。
嘗試
try:
from namespace import something
except NameError:
from .namespace import something
是的。 您需要包含__init__.py
文件的目錄,該文件是初始化包的文件。 來,看看這個。
需要 __init__.py 文件才能使 Python 將目錄視為包含包; 這樣做是為了防止具有通用名稱(例如字符串)的目錄無意中隱藏了稍后出現在模塊搜索路徑上的有效模塊。 在最簡單的情況下,__init__.py 可以只是一個空文件,但它也可以執行包的初始化代碼或設置 __all__ 變量,稍后將介紹。
例如:/etc/環境
PYTHONPATH=$PYTHONPATH:/opt/folder1:/opt/folder2
/opt/folder1/foo
/opt/folder2/foo
而且,如果您嘗試導入 foo 文件,python 將不知道您想要哪個。
從 foo 導入 ... >>> 導入錯誤:沒有名為 foo 的模塊
我的兩分錢:
吐:
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
這讓我很困惑 - 瀏覽了一些建議丑陋的 syspath hack 的帖子和帖子(正如你所見,我的__init__.py
都在那里)。 事實證明,game/oblivion.py 和 game/oblivion 混淆了 python,它吐出了相當無用的“沒有名為 RecordGroups 的模塊”。 我對記錄此(同名)行為的解決方法和/或鏈接感興趣-> EDIT(2017.01.24)-看看如果我有一個模塊和一個同名的包怎么辦? 有趣的是,通常包優先,但顯然我們的啟動器違反了這一點。
如果您嘗試了上面提供的所有方法但都失敗了,那么您的模塊可能與內置模塊同名。 或者,文件夾中存在的同名模塊在sys.path
中的優先級高於您的模塊。
要調試,請說您的from foo.bar import baz
投訴ImportError: No module named bar
。 更改為import foo; print foo
import foo; print foo
,它將顯示foo
的路徑。 這是你所期望的嗎?
如果不是,請重命名foo
或使用絕對導入。
通過編寫print (sys.path)
解決了我的問題,並發現盡管進行了全新安裝,python 仍在使用過時的軟件包。 刪除這些使 python 自動使用正確的包。
就我而言,因為我使用 PyCharm 和 PyCharm 為項目文件夾中的每個項目創建一個“venv”,但它只是 python 的一個迷你環境。 雖然您已經在 Python 中安裝了所需的庫,但在您的自定義項目 'venv' 中,它不可用。 這就是 PyCharm 中出現“ImportError: No module named xxxxxx”的真正原因。 要解決此問題,您必須通過以下步驟將庫添加到您的項目自定義環境中:
享受。
就我而言,問題是我正在鏈接到調試python
和boost::Python
,這要求擴展名是FooLib_d.pyd
,而不僅僅是FooLib.pyd
; 重命名文件或更新CMakeLists.txt
屬性修復了錯誤。
Linux:導入的模塊位於 /usr/local/lib/python2.7/dist-packages
如果您使用的是用 C 編譯的模塊,請不要忘記在sudo setup.py install
之后對 .so 文件進行 chmod。
sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
我的問題是我將帶有__init__.py
文件的目錄添加到 PYTHONPATH,而實際上我需要添加它的父目錄。
如果您使用安裝腳本/實用程序(例如setuptools )來部署您的軟件包,請不要忘記將相應的文件/模塊添加到安裝程序中。
如果支持,請使用find_packages()
或類似方法自動將新包添加到安裝腳本。 這絕對會讓您免於頭疼,特別是如果您將項目擱置一段時間,然后再添加一些東西。
import setuptools
setuptools.setup(
name="example-pkg",
version="0.0.1",
author="Example Author",
author_email="author@example.com",
description="A small example package",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
)
(示例取自setuptools 文檔)
我有同樣的問題(Python 2.7 Linux),我找到了解決方案,我想分享它。 就我而言,我的結構如下:
Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py
在“main.py”中,我嘗試了以下所有組合均未成功:
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 ...
解決方案比我想象的要簡單得多。 我將文件夾“Booklet”重命名為“booklet”,就是這樣。 現在 Python 可以通過在“main.py”中使用代碼來正常導入問題類:
from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass
由此我可以得出結論,像“booklet”這樣的包名稱(文件夾)必須以小寫字母開頭,否則 Python 會將其與類名和文件名混淆。
顯然,這不是你的問題,但是John Fouhy 的回答非常好,而且這個線程幾乎有任何可能導致這個問題的東西。 所以,這是另一件事,我希望這可能對其他人有所幫助。
在 linux 服務器中嘗試dos2unix script_name
(使用命令find . -name '*.pyc' -delete
刪除所有(如果有的話) pyc
文件)
如果您在 Windows 上處理腳本,則重新運行
就我而言,我正在使用sys.path.insert()
導入本地模塊,並且從其他庫中module not found
。 我不得不將sys.path.insert()
放在報告module not found
的導入下方。 我想最好的做法是將sys.path.insert()
放在導入的底部。
我發現更改別名文件夾 (Mac) 的名稱(通過 GUI)可能會導致加載模塊出現問題。 如果更改了原始文件夾名稱,請重新制作符號鏈接。 我不確定這種行為有多普遍,但調試起來令人沮喪。
在遇到同樣的問題后,我發現我的解決方案是從我的項目中刪除所有pyc
文件,似乎這些緩存的文件以某種方式導致了這個錯誤。
我發現這樣做的最簡單方法是在 Windows 資源管理器中導航到我的項目文件夾並搜索*.pyc
,然后選擇所有( Ctrl + A )並刪除它們( Ctrl + X )。
可能我可以通過刪除特定的pyc
文件來解決我的問題,但我從未嘗試過
我遇到了同樣的問題: Import error
。 此外,該庫已 100% 正確安裝。 問題的根源是在我的 PC 上安裝了 Python 3 版本(anaconda 數據包)。 這就是為什么圖書館沒有安裝到正確的位置。 之后,我只是在我的 IDE PyCharm 中更改為正確版本的 python。
我有同樣的錯誤。 這是由於有人在與我的腳本相同的文件夾中創建了一個文件夾,該文件夾的名稱與我從其他地方導入的模塊沖突。 它沒有導入外部模塊,而是查看了這個顯然不包含預期模塊的文件夾。
就我而言,我包含了 package.egg 文件夾的路徑,而不是下面的實際包。 我將包復制到頂層並且它有效。
這對我有用:在父文件夾內創建了__init__.py
文件(在你的情況下,在site-packages
文件夾內)。 並像這樣導入:
from site-packages.toolkit.interface import interface
希望它對你也有用!
我有一個類似的問題。 我創建了一個名為python3.6
的新虛擬環境。
conda create -n python3.6 python=3.6
pip install pandas
一切正常,但是當我運行腳本時,發生了錯誤
ModuleNotFoundError: No module named 'pandas'
我發現pip的python包和緩存的元數據已經更新了,但實際上並沒有下載pandas
包。 所以我嘗試通過 pip 重新安裝,
pip uninstall pandas --no-cache-dir
pip install pandas
這解決了它。
在 ubuntu apt-get
安裝程序中,python3 版本的包通常命名為
python3-XYZ
和 python2 版本
python-XYZ
根據經驗,請嘗試錯誤消息中提到的包的python3-XYZ
或python-XYZ
。 請注意,有時依賴包也需要這種apt-get
技巧。
我對 python2.7 的燒瓶包有相同的錯誤消息,當我嘗試時它消失了:
sudo apt-get install python-flask
因此,嘗試:
sudo apt-get install python-[YOURPYTHONVERION]-[YOURERRORPACKAGE]
或檢查提到的依賴項。
如答案中所述,使用 sys.path.append 對我有用。 起初我認為它不起作用,直到我意識到我在目錄路徑之前有一個空格。 因此,請確保您在路徑之前沒有拼寫錯誤或空格
所有 python 文件的文件編碼必須是 utf-8。
見這里: https ://github.com/jupyter/notebook/issues/3166#issuecomment-581332097
對我來說,將文件作為模塊運行會有所幫助。
代替
python myapp/app.py
使用
python -m myapp.app
它並不完全相同,但在某些情況下它可能是更好的方法。
如果您的最后期限很緊,而其他一切都失敗了:
import sys
import os
wd = '/path/to/current/script/'
sys.path.append(wd)
os.chdir(wd)
print(os.getcwd())
print(sys.path)
file.py
#!/bin/python
from bs4 import BeautifulSoup
python
是pyyhon2
$ file $(which python)
/sbin/python: symbolic link to python2
file.py
需要python3
,對於這種情況( bs4
)python2
執行這個模塊:$ python file.py
# or
$ file.py
# or
$ file.py # if locate in $PATH
error
的兩種方法,# should be to make python3 as default by symlink
$ rm $(which python) && ln -s $(which python3) /usr/bin/python
# or use alias
alias python='/usr/bin.../python3'
或將file.py
中的shebang
更改為
#!/usr/bin/...python3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.