我发现用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
首先,让我们看看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
您的情况下的路径)
现在您知道答案了:
python package/test.py
给ImportError: No module named package
?因为解释器没有“看到”包。为了使解释器知道package package
,PythonTest
必须位于中sys.path
,但不是。
因为现在PythonTest
在sys.path
,所以解释器能够找到包package
。
问题内容: 我已经使用命令安装了redis,但是当我运行Python程序时收到此错误: 知道发生了什么问题还是我也应该安装其他软件包?我正在使用Ubuntu 13.04,并且具有Python 2.7。 问题答案: 要安装redis-py,只需: 或者(您确实应该使用点子): 或从来源: 入门 详细信息:https : //pypi.python.org/pypi/redis
问题内容: 由于某种原因,我不能使用or模块。在python shell中运行以下命令后 要么 我得到这个错误 ModuleNotFoundError:没有名为“ Tkinter”的模块 要么 ModuleNotFoundError:没有名为“ tkinter”的模块 可能是什么原因,我们如何解决呢? 问题答案: 您可能需要使用以下一种(或类似的方式)安装它: 您也可以针对python 3.7提及
问题内容: 我在 Google App Engine的Python 使用Google Translate API时遇到此错误,但是我不知道如何解决, 我将尝试 设置指示Google App Engine SDK的环境 ,然后再次上传到Google Apps Engine, 始终会收到错误消息 , 错误:服务器错误 服务器遇到错误,无法完成您的请求。如果问题仍然存在,请报告您的问题并提及此错误消息以
问题内容: 我指的是以下教程来为我的Web应用程序创建登录页面。 http://code.tutsplus.com/tutorials/intro-to-flask-signing-in-and-out--net-29982 我的数据库有问题。我正在 当我执行 我已经尝试了所有可能的方法来安装python mysql,这是本教程中提到的一种,easy_install,sudo apt-get in
问题内容: 我是这个Python世界的新手(仅1周)。我尝试安装django-mssql,但是当我尝试导入库(使用)时,出现以下错误消息: 我试图寻找那个图书馆而没有成功。 你们能指出我正确的方向吗? 问题答案: 您缺少包裹。它带有ActivePython,但您可以将它作为pywin32的一部分单独在GitHub(以前在SourceForge上)上获得。 您也可以简单地使用:
问题内容: 我目前正在练习matplotlib。这是我练习的第一个示例。 当我使用运行脚本时,它可以正确显示绘图。但是,我自己运行它,它引发了以下问题: python是否在不同位置查找matplotlib? 环境是: numpy,scipy,matplotlib已安装: 问题答案: 您的计算机上安装了两个python,一个是Mac OSX随附的标准python,第二个是您使用端口安装的python