尝试运行Python脚本时出现“ ImportError:未命名模块”


144

我正在尝试运行一个脚本,该脚本除其他外将启动python脚本。我收到一个ImportError:没有名为...的模块,但是,如果我启动ipython并通过解释器以相同的方式导入相同的模块,则该模块将被接受。

怎么回事,我该如何解决?我试图了解python如何使用PYTHONPATH,但是我感到非常困惑。任何帮助将不胜感激。


4
您需要提供更多信息。当您说“运行脚本”时,您是说shell脚本吗?您无法导入哪个模块?该模块在哪里?您的脚本在哪里?
BrenBarn

2
如果您想对“正在发生的事情”有一个明确的答案,请使用-v选项启动python,然后您会看到python在(或没有)找到您要导入的模块的位置。
FatalError 2013年

您要导入什么?两个python脚本是否在同一目录中?
pynovice

2
请给我们您正在运行的代码,堆栈跟踪的全文以及您为产生错误所采取的确切步骤。当我们不知道确切的问题是什么时,很难提供帮助。
MattDMo

5
我想这是很多用户遇到的问题,即使是在首次提出问题的四年后。
CodeOcelot

Answers:


182

由于命令行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编辑或设置为全局变量是os依赖的,这里将在UnixWindows上进行详细讨论。


1
PSA:如果您因为在jupyter-notebook中遇到此错误而遇到了这样的问题,那么请参见下文stackoverflow.com/a/27944947/127971, 不幸的是,这个问题对于单个答案而言不够具体。
迈克尔(Michael)

@michael答案是在一般情况下导入Python模块;解释器在目录中搜索要导入的模块(是否笔记本)时,需要dunder init.py文件。上面有关笔记本解释器工作目录和设置PYTHONPATH的答案是正确的。
BoltzmannBrain

我确实说过,由于问题的措辞,会有多个正确答案。我并不是在暗示这个答案正确。但是,如果使用jupyter-notebook,您将要触摸文件__init_.py,对吗?......并没有打算要修改PYTHONPATH,也没有电话sys.path.append,即使他们也正确(正确吗?)。我的意思是,我在其中包含数十个带有代码的目录,并且我不会将它们全部添加到路径中,也不会期望其他用户访问其jupyter配置文件,即使它是一个目录也是如此。
迈克尔”

16

__init__.py运行python项目时,只需在显示错误的文件夹下创建一个名称为空的python文件即可。


1
init.py ”是指“ _ init_ .py”,对吗?我将_ init_ .py 创建为一个空文件,它对我有用。非常感谢。但是为什么需要这个呢?在将python脚本放在与ipython笔记本相同的目录中之前,导入工作正常。
Eduardo Reis 2015年

3
实际上,init .py用于指示python,以指示在相应位置包含一些软件包。那么只有它会找到子模块,无论您在该模块下创建了什么。如果您不创建' init .py',则意味着python不知道其中包含某些软件包。例如:例如,从“ Myfolder.Mypackage import Mymodules”中,您应该启动init .py来指示python告诉这里有一些软件包。否则它不知道。
Mohideen bin Mohammed 2015年

1
是的,完美的答案。这在python 2.7中是必需的,但请注意3
Agape Gal'lo

这为我解决了python 3中的问题。
瑞克(Rick)支持莫妮卡(Monica)

我也解决了这个问题-使用jupyter笔记本,在ipynb文件的子目录中使用python源代码;例如,foo.ipynb使用bar/baz.py,添加空bar/__init__.py文件,以便笔记本可以使用from bar.baz import MyClass
迈克尔

12

确保它们都使用相同的解释器。这在Ubuntu上发生在我身上:

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

而且sys.path是两个解释不同。为了解决这个问题,我删除了Python 3.3。


使用miniconda安装了一堆与python相关的东西后,我也遇到了这个问题。捆绑的ubuntu python 2.7与miniconda python 2.7不同。这个答案使我可以解决此问题
bph

4
这是我的问题。我已经升级到python 2.7.11,但是我的iPython交互式外壳仍在使用2.7.5。我只需要运行pip install --upgrade ipython以获取最新版本,然后默认情况下它将自动使用2.7.11。
Abundnce10

我的IPython是7.4.0,而根本没有这样的Python版本。
aderchox

@aderchox在ipython中运行此命令以获取解释器版本:import sys; sys.version
z0r19年

7

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

请参考lucypark链接,该解决方案适用于我的情况。它通过安装opencv时发生

conda install opencv

在iPython中出现导入错误,有三个步骤可以解决此问题:

import cv2
ImportError: ...

1.使用以下命令检查Python和iPython中的路径

import sys
sys.path

您会发现与Python和Jupyter不同的结果。第二步,只需使用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

在vi中,附加到文件:

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

完成


'ipython配置文件创建'....是的!这是唯一(不永久)的解决方案,可解决jupyter笔记本电脑无法从环境PATH和PYTHONPATH读取的问题,而无需在每个文件(yuk)开头都使用混乱的sys.path语句。谢谢@杰西。
JohnL_10

6

这样做是sys.path.append('my-path-to-module-folder')可行的,但是为了避免每次要使用IMod时都必须在IPython中执行此操作,可以将其添加export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"~/.bash_profile文件中。


2

在安装ipython之前,我通过easy_install安装了模块;说sudo easy_install mechanize

安装ipython之后,我必须重新运行easy_install才能使ipython识别模块。


2

遇到了类似的问题,通过调用python3而不是python进行了修复,我的模块在Python3.5中。


2

如果从命令行运行它,有时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)

我不确定这是否是解决问题的好方法,但是是的,它确实对我有用。


如果您始终从同一位置运行脚本,那么它将起作用。否则,您将遇到问题,因为os.getcwd()会获得运行脚本的目录,而不是脚本文件所在的目录。
内森·亚瑟

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

我发现了这种差异的另一个来源:

我在本地和在virtualenvs中都安装了ipython。我的问题是,在使用ipython新建的virtualenv内部,安装了ipython系统,它与virtualenv中的python和ipython版本不同(2.7.x与3.5.x),并且随之而来。

我认为,每当安装将要安装二进制文件的东西时,明智的做法yourvirtualenv/binrehash针对正在使用的任何外壳程序立即运行或类似运行,以便获取正确的python / ipython。(必须检查是否有合适pip的安装后挂钩...)


0

不带脚本的解决方案:

  1. 打开Spyder->工具-> PYTHONPATH管理器
  2. 通过单击“添加路径”来添加Python路径。例如:“ C:\ Users \ User \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ site-packages”
  3. 单击“同步...”以允许其他程序(例如Jupyter Notebook)使用在步骤2中设置的pythonpaths。
  4. 如果Jupyter已打开,请重新启动

0

这可能是由系统上安装的不同python版本(即python2python3)引起的

运行命令$ pip --version$ pip3 --version检查哪个来自Python 3x。例如,您应该看到如下版本信息:

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

然后example.py使用以下命令运行脚本

$ python3 example.py

0

出现在我的目录下utils。我试图将此目录导入为:

from utils import somefile

utils已经是python中的软件包。只需将您的目录名称更改为其他名称,它就可以正常工作。


0

此类错误最有可能是由于python版本冲突引起的。例如,如果您的应用程序仅在python 3上运行,并且您还获得了python 2,那么最好指定要使用的版本。例如使用

python3 .....

代替

python

0

该答案适用于此问题,如果

  1. 您不想更改代码
  2. 您不想永久更改PYTHONPATH

临时修改PYTHONPATH

下面的路径可以是相对的

PYTHONPATH=/path/to/dir python script.py

0

导入sys sys.path.append('/ Users / {user} /Library/Python/3.7/lib/python/site-packages')import ta


-1

删除pathlib并重新安装它。删除sitepackages文件夹中的pathlib并使用pip命令重新安装pathlib软件包:

pip install pathlib
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.