ImportError:没有名为包的模块

纳尔索克

我发现用Python导入模块很复杂,因此我正在做一些实验来清除它。这是我的文件结构:

PythonTest/
  package/
    __init__.py
    test.py

内容__init__.py

package = 'Variable package in __init__.py'
from package import test

内容test.py

from package import package
print package

当我离开package(in PythonTest)并执行时python package/test.py,我得到:

Traceback (most recent call last):
  File "package/test.py", line 1, in <module>
    from package import package
ImportError: No module named package

预期的输出是Variable package in __init__.py我究竟做错了什么?


但是,我可以在交互模式下获得预期的输出:

sunqingyaos-MacBook-Air:PythonTest sunqingyao$ python
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import package
Package in __init__.py
laike9m

首先,让我们看看Python如何搜索软件包和模块。 sys.path

字符串列表,用于指定模块的搜索路径。从环境变量初始化PYTHONPATH,再加上与安装有关的默认值。

那就是搜索路径。因此,如果您的模块/包位于之一sys.path,则python解释器能够找到并导入它。医生说更多:

在程序启动时进行初始化时,此列表的第一项path[0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果解释器是交互式调用的,或者从标准输入中读取了脚本),path[0]则为空字符串,该字符串将引导Python首先搜索当前目录中的模块。

我以修改test.py为例。

import sys; import pprint
pprint.pprint(sys.path)

from package import package
print package 

有两种情况:

$ python package/test.py
['/Users/laike9m/Dev/Python/TestPython/package',
 '/usr/local/lib/python2.7/site-packages/doc2dash-2.1.0.dev0-py2.7.egg',
 '/usr/local/lib/python2.7/site-packages/zope.interface-4.1.3-py2.7-macosx-10.10-x86_64.egg',
 '/usr/local/lib/python2.7/site-packages/six-1.10.0-py2.7.egg',
 '/usr/local/lib/python2.7/site-packages/colorama-0.3.3-py2.7.egg',

如您所见,path[0]is/Users/laike9m/Dev/Python/TestPython/package是包含test.py用于调用Python解释器的脚本的目录

$ python                                         
Python 2.7.12 (default, Jun 29 2016, 14:05:02)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import package
['',
 '/usr/local/lib/python2.7/site-packages/doc2dash-2.1.0.dev0-py2.7.egg',
 '/usr/local/lib/python2.7/site-packages/zope.interface-4.1.3-py2.7-macosx-10.10-x86_64.egg',
 '/usr/local/lib/python2.7/site-packages/six-1.10.0-py2.7.egg',
 '/usr/local/lib/python2.7/site-packages/colorama-0.3.3-py2.7.egg',
...

现在是第二种情况,当以交互方式调用时,“path[0]是空字符串,它指示Python首先在当前目录中搜索模块”。当前目录是什么?/Users/laike9m/Dev/Python/TestPython/((这是我机器上的路径,相当于PythonTest您的情况下的路径

现在您知道答案了:

  1. 为什么python package/test.pyImportError: No module named package

    因为解释器没有“看到”包。为了使解释器知道package packagePythonTest必须位于中sys.path,但不是。

  2. 为什么以交互方式工作?

    因为现在PythonTestsys.path,所以解释器能够找到包package

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python ImportError:没有名为包的模块

来自分类Dev

ImportError:没有名为“扭曲”的模块

来自分类Dev

ImportError:没有名为gdal的模块

来自分类Dev

ImportError没有名为视图的模块

来自分类Dev

ImportError:没有名为arff的模块

来自分类Dev

ImportError:没有名为redis的模块

来自分类Dev

ImportError:没有名为pyttsx的模块

来自分类Dev

ImportError:没有名为请求的模块

来自分类Dev

ImportError:没有名为“ virtualenvwrapper”的模块

来自分类Dev

ImportError:没有名为_mssql的模块

来自分类Dev

ImportError:没有名为virtualenv的模块

来自分类Dev

ImportError:没有名为“ mirror”的模块

来自分类Dev

ImportError:没有名为svmcmpl的模块

来自分类常见问题

ImportError:没有名为scipy的模块

来自分类Dev

ImportError:没有名为appengine的模块

来自分类Dev

ImportError:没有名为impyla的模块

来自分类Dev

ImportError:没有名为控件的模块

来自分类Dev

ImportError:没有名为sekizai的模块

来自分类Dev

ImportError:没有名为队列的模块

来自分类Dev

ImportError:没有名为Leap的模块

来自分类Dev

ImportError:没有名为_imagingtk的模块

来自分类Dev

ImportError:没有名为parse的模块

来自分类Dev

ImportError:没有名为“ pymongo”的模块

来自分类Dev

ImportError:没有名为pexpect的模块

来自分类Dev

ImportError:没有名为“ sha”的模块

来自分类Dev

ImportError:没有名为tweepy的模块

来自分类Dev

ImportError:没有名为datetime的模块

来自分类Dev

ImportError:没有名为pjsip的模块

来自分类Dev

ImportError:没有名为pxssh的模块