首先,让我们看看Python如何搜索包和模块。
sys.path
字符串列表,用于指定模块的搜索路径。从环境变量初始化
PYTHONPATH,再加上与安装有关的默认值。
那就是搜索路径。因此,如果您的模块/包位于之一
sys.path,则python解释器可以找到并导入它。医生说更多:
在程序启动时进行初始化,该列表的第一项
path[0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果解释器是交互式调用的,或者从标准输入中读取了脚本),path[0]则为空字符串,该字符串将Python首先引导到当前目录中的搜索模块。
我以修改
test.py为例。
import sys; import pprintpprint.pprint(sys.path)from package import packageprint 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 darwinType "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。