簡體   English   中英

Python 錯誤“ImportError: No module named”

[英]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 帖子的評論,我想這就是發生的事情:

  1. 您在 Windows 上編輯了__init__.py
  2. Windows 編輯器添加了一些非打印的內容,可能是回車(Windows 中的行尾是 CR/LF;在 unix 中只有 LF),或者可能是 CTRL-Z(Windows 文件結尾)。
  3. 您使用 WinSCP 將文件復制到您的 unix 機器上。
  4. WinSCP 想:“這有一些不是基本文本的東西;我會放一個 .bin 擴展名來表示二進制數據。”
  5. 缺少__init__.py (現在稱為__init__.py.bin )意味着 python 不將工具包理解為一個包。
  6. 您在適當的目錄中創建__init__.py並且一切正常...?

(local directory)/site-packages/toolkit

有一個__init__.py嗎?

要使導入遍歷您的目錄,每個目錄都必須有一個__init__.py文件。

當我在 LPTHW 中做這個練習時,我遇到了非常相似的事情。 我永遠無法讓 Python 識別出我調用的目錄中有文件。 但我最終能夠讓它工作。 我所做的,以及我推薦的,是試試這個:

(注意:從您最初的帖子中,我假設您使用的是基於 *NIX 的機器並從命令行運行,因此此建議是針對此量身定制的。由於我運行 Ubuntu,這就是我所做的)

  1. 將目錄 (cd) 更改為文件所在目錄之上的目錄。 在這種情況下,您嘗試運行mountain.py文件,並嘗試調用位於不同目錄中的toolkit.interface.py模塊。 在這種情況下,您將轉到包含這兩個文件的路徑的目錄(或者換句話說,這兩個文件的路徑共享的最近的目錄)。 在這種情況下是toolkit目錄。

  2. 當您在toolkit目錄中時,在命令行中輸入這行代碼:

    export PYTHONPATH=.

    這會將您的 PYTHONPATH 設置為“。”,這基本上意味着您的 PYTHONPATH 現在將在您當前所在的目錄中查找任何被調用的文件(更重要的是,在您所在目錄的子目錄分支中。因此,它不僅會查看當前目錄,還會查看當前目錄中所有目錄)。

  3. 在上述步驟中設置好 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 編輯器,例如vinano 如果您使用 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__ 變量,稍后將介紹。

  1. 您必須將文件 __ init__.py 放在與您要導入的文件相同的目錄中。
  2. 您不能嘗試從 PYTHONPATH 上配置的 2 個文件夾中導入具有相同名稱的文件。

例如:/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)-看看如果我有一個模塊和一個同名的包怎么辦? 有趣的是,通常優先,但顯然我們的啟動器違反了這一點。

編輯(2015.01.17):我沒有提到我們使用這里剖析的自定義啟動器

如果您嘗試了上面提供的所有方法但都失敗了,那么您的模塊可能與內置模塊同名 或者,文件夾中存在的同名模塊在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”的真正原因。 要解決此問題,您必須通過以下步驟將庫添加到您的項目自定義環境中:

  • 在 PyCharm 中,從菜單“文件”-> 設置
  • 在設置對話框中,項目:XXXProject->Project Interpreter
  • 單擊“添加”按鈕,它將顯示“可用包”對話框
  • 搜索您的庫,單擊“安裝包”
  • 然后,您需要的所有軟件包都將安裝在您的項目自定義“venv”文件夾中。

設置對話框

享受。

就我而言,問題是我正在鏈接到調試pythonboost::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-XYZpython-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
  • 如果您的默認pythonpyyhon2
$ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM