我们在写python代码或者阅读别人的代码时,可能会碰到对应module无法找到的问题,这时如何解决呢?我们如果对python解释器如何查找对应的module有比较深刻的理解,那么我们就可以轻松解决相关问题。

https://leemendelowitz.github.io/blog/how-does-python-find-packages.html

sys.path

import sys
print('\n'.join(sys.path))
# 当前目录
D:\devenv\Code\intro_ds\knowhow
D:\devenv\Code\intro_ds
# anaconda
D:\Continuum\Anaconda3\python35.zip
D:\Continuum\Anaconda3\DLLs
D:\Continuum\Anaconda3\lib
D:\Continuum\Anaconda3
D:\Continuum\Anaconda3\lib\site-packages
D:\Continuum\Anaconda3\lib\site-packages\Sphinx-1.4.6-py3.5.egg
D:\Continuum\Anaconda3\lib\site-packages\win32
D:\Continuum\Anaconda3\lib\site-packages\win32\lib
D:\Continuum\Anaconda3\lib\site-packages\Pythonwin
D:\Continuum\Anaconda3\lib\site-packages\setuptools-27.2.0-py3.5.egg

上面看到sys.path目录包含了当前脚本所在的目录以及对应安装site环境,那么问题来了:

sys.path是如何被赋值的

从python的文档中https://docs.python.org/2/library/sys.html#sys.path看到:sys.path使用当前的工作目录,以及罗列在PYTHONPATH环境变量中的目录,再加上installation-dependent default paths(这是由site模块来控制的)

如果你的PYTHONPATH环境变量并没有设置,则sys.path将包含:当前工作目录+site模块执行的目录变更。当你启动python时,site模块自动被imported加载。

https://docs.python.org/2/library/site.html#module-site

操作sys.path

import sys, os

# This won't work - there is no hi module
import hi
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named hi # Create a hi module in your home directory.
home_dir = os.path.expanduser("~")
my_module_file = os.path.join(home_dir, "hi.py")
with open(my_module_file, 'w') as f:
f.write('print "hi"\n')
f.write('a=10\n') # Add the home directory to sys.path
sys.path.append(home_dir) # Now this works, and prints hi!
import hi
print hi.a

module的__file__属性

当你import一个module时,你可以通过查看__file__属性来找到该module具体存在于哪个目录中:

> import numpy
> numpy.__file__
'/usr/local/lib/python2.7/dist-packages/numpy/__init__.pyc'

注意,以上对于静态编译到解释器的内置module不适用,比如sys模块就没有__file__属性

imp模块

python是如何找到对应的package的?的更多相关文章

  1. python项目内import其他内部package的模块的正确方法

    转载 :https://blog.csdn.net/u011089523/article/details/52931844 本文主要介绍如何在一个Python项目中,优雅的实现项目内各个package ...

  2. Python(模块(modue)、包(package))

    ''' 一 模块 模块一共三种: python标准库 第三方模块 应用程序自定义模块 模块两种执行方式: 1 用于启动执行 2 用于被调用执行 key:import module: 将执行文件(mod ...

  3. 21.python的模块(Module)和包(Package)

    目录 模块(Module)和包(Package) 模块(modue)的概念 模块导入方法 1.import 语句 2.from-import 语句 3.from-import* 语句 4.运行本质 i ...

  4. python的模块(module)和包(package)机制:import和from..import..

    在python用import或者from...import来导入相应的模块. 模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中 ...

  5. 使用poco 的NetSSL_OpenSSL 搭建https 服务端,使用C++客户端,java 客户端访问,python访问(python还没找到带证书访问的代码.)

    V20161028 由于项目原因,需要用到https去做一些事情. 这儿做了一些相应的研究. 这个https 用起来也是折腾人,还是研究了一周多+之前的一些积累. 目录 1,java client 通 ...

  6. Python:当你遇到了the package “public”?

    前几天跑github上的一个python项目,先都是看看需要哪些模块哪些包,安装配置好环境的.可是看到 import public我眉头一皱,觉得事情并不简单! 所以准备扒一扒!当然项目需要也是真的哈 ...

  7. Python中模块(Module)和包(Package)的区别

    本文绝大部分内容转载至:廖雪峰官方网站 1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函 ...

  8. Python教你找到最心仪的对象

    规则 单身妹妹到了适婚年龄,要选对象.候选男子100名,都是单身妹妹没有见过的.百人以随机顺序,从单身妹妹面前逐一经过.每当一位男子在单身妹妹面前经过时,单身妹妹要么选他为配偶,要么不选.如果选他,其 ...

  9. 漫漫人生路,我们该何去何从! Python让我找到了方向

    互联网寒冬 2017年冬天,是我人生中最难熬的一个冬天,其实2017年的冬天并不算太冷,比这冬日的寒风还要严寒的要属这所谓的"互联网寒冬"吧!各大厂裁员的消息充斥着互联网,互联网表 ...

随机推荐

  1. scala combineByKey用法说明

    语法是: combineByKey[C](   createCombiner: V => C,   mergeValue: (C, V) => C,   mergeCombiners: ( ...

  2. php 按照二位数组中某个指定的字段进行排序

    /** * 按照二维数组中某个指定的某个字段进行排序 * @param $array 需要被排序的数组 * @param $flag 排序的标志 1,SORT_DESC 降序 2,SORT_ASC 升 ...

  3. 开发工具 -- PyDev的使用

    1.创建PyDev工程 2.创建源文件夹src 3.新建.py文件 其他注意事项 1.设置字体大小 2.显示行号Ctrl + F10 3.编码设置为UTF-8 4.最好将工程创建到默认工作空间 5.总 ...

  4. js二维数组

    1.判断是否为二维数组 function isMultiArr(arr){ return arr.every(function(element){ return element instanceof ...

  5. Spring Boot 的彩色日志

    springboot的彩色日志灰常漂亮, 看起来也很舒服. 但是自定义的日志就是一纯白色的, 丑到不行. 所以就copy他的彩色日志来养眼: <!-- 彩色日志 --> <!-- 彩 ...

  6. InterView之PHP

    PHP HTTP Keep-Alive的作用 作用 Keep-Alive:使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接.Web服务器 ...

  7. Go RabbitMQ (一)

    RabbitMQ 简介 RabbitMQ是一个消息代理,用来负责接收和转发消息. 术语 生产者:生产者是负责发送消息的 队列:队列是RabbitMQ用来存储消息的,受主机内存和磁盘大小的限制,本质上是 ...

  8. ruby on rails 权限管理gem cancan

    系统的model关系如下: 用户类 class AdminUser embeds_many :permissions  accepts_nested_attributes_for :permissio ...

  9. Django请求响应对象

    请求与响应对象 HttpRequest HttpRequest存储了客户请求的相关参数和一些查询方法. path 请求页面的全路径,不包括域名-例如, "/hello/". met ...

  10. 如何优雅的爬取 gzip 格式的页面并保存在本地(java实现)

    1. 引言 在爬取汽车销量数据时需要爬取 html 保存在本地后再做分析,由于一些页面的 gzip 编码格式, 获取后要先解压缩,否则看到的是一片乱码.在网络上仔细搜索了下,终于在这里找到了一个优雅的 ...