nal*_*zok 8 python import module python-import python-2.7
我发现Python中的导入模块很复杂,所以我正在做实验来清理它.这是我的文件结构:
PythonTest/
package/
__init__.py
test.py
Run Code Online (Sandbox Code Playgroud)
内容__init__.py:
package = 'Variable package in __init__.py'
from package import test
Run Code Online (Sandbox Code Playgroud)
内容test.py:
from package import package
print package
Run Code Online (Sandbox Code Playgroud)
当我离开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
Run Code Online (Sandbox Code Playgroud)
预期的产出是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
Run Code Online (Sandbox Code Playgroud)
首先让我们看看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
Run Code Online (Sandbox Code Playgroud)
有两种情况:
$ 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',
Run Code Online (Sandbox Code Playgroud)
如您所见,path[0]是/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',
...
Run Code Online (Sandbox Code Playgroud)
现在是第二种情况,当以交互方式调用时," path[0]是空字符串,它指示Python首先搜索当前目录中的模块." 目前的目录是什么?/Users/laike9m/Dev/Python/TestPython/.(看看这是我机器上的路径,它等同PythonTest于你的路径)
现在你知道了答案:
为什么python package/test.py要给ImportError: No module named package?
因为解释器没有"看到"包.要让口译员知道包裹package,PythonTest必须在sys.path,但事实并非如此.
为什么这在交互模式下工作?
因为现在PythonTest是sys.path,所以解释器能够找到包package.
| 归档时间: |
|
| 查看次数: |
13458 次 |
| 最近记录: |