python 模块导入 原理

查找是按照 sys.path 中的路径挨个扫描。若都不存在则提示error。

sys.path路径第一个是当前运行脚本所在的目录,其后是PYTHONPATH(一般若步专门设置则为空)设置的目录,在后面是全局包所在目录。

PS:一个目录要有__init__.py才能作为包被导入

示例代码地址:

github

一共四种情况

要导入的包在当前目录

要导入的包在子目录

要导入的包在父目录

要导入的包在兄目录(这种情况和包在其他十万八千里地方一样)

以下是目录结构

以下示例的运行目录都是test_module/sub1

即 python case_.py

case1

要导入的模块和当前运行文件在同一目录,直接import

a.py

print("I'm a.py")

case_1.py

#!/usr/bin/env python
# encoding: utf-8
import a
print('I\'m case_1.py')

输出:

I'm sub1/a.py
I'm case_1.py

case2

子目录建立__init__.py 文件,import subsub.a

case2

#!/usr/bin/env python
# encoding: utf-8
import subsub.a
print('I\'m case_2.py')

输出

I'm subsub/aa.py
I'm case_2.py

case3

两个方法,其一直接改变sys.path内容,使用sys.path.append(),注意这里添加的路径是对于运行该文件时的当前目录来说的;其二设置PYTHONPATH添加父目录

case_3_1

case_3_1.py

#!/usr/bin/env python
# encoding: utf-8
import sys
sys.path.append('../')
import aa
print('I\'m case_3_1.py')

case_3_2

执行case_3_2前 先使用这个命令 export PYTHONPATH=$PYTHONPATH:/home/pb/test_module

case_3_2.py

#!/usr/bin/env python
# encoding: utf-8
import aa
print('I\'m case_3_2.py')

case4

和第三种一样,使用sys.path.append()或者设置PYTHONPATH添加父目录

case_4

#!/usr/bin/env python
# encoding: utf-8
import sys
sys.path.append('../')
import sub2.aa
print('I\'m case_4.py')

其实掌握了sys.path 和PYTHONPATH后目录在哪里都能用这样的stopgap方法搞一下,但是如果是第四种情况还是建议使用virtualenv吧,不然你以后会发疯的。

一文解决python模块导入的更多相关文章

  1. P4实验问题 解决python模块导入

    参考:Python导入自定义包或模块 在执行./run_demo.sh的过程中,遇到了python的模块问题: root@ubuntu:/home/wasdns/tutorials/SIGCOMM_2 ...

  2. python模块导入细节

    python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: ...

  3. 【转】python模块导入细节

    [转]python模块导入细节 python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码 ...

  4. python模块导入总结

    python模块导入总结 模块导入方式 定义test.py模块 def print_func(): print("hello") import 语句 导入模块语法 import m ...

  5. 详解Python模块导入方法

    python常被昵称为胶水语言,它能很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松联结在一起.python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的 ...

  6. python 模块导入import和import from区别

    模块就是一个.py文件,在名字空间下导入模块导入import和import from,那么python 模块导入import和import from区别是什么呢 1,import 导入模块 impor ...

  7. python 模块导入

    1. 模块导入: 要使用一个模块,我们必须首先导入该模块.Python使用import语句导入一个模块.例如,导入系统自带的模块 math: import math 你可以认为math就是一个指向已导 ...

  8. python模块导入

    官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: 用于执行的可执行程序文件 ...

  9. python模块导入-软件开发目录规范-01

    模块 模块的基本概念 模块: # 一系列功能的结合体 模块的三种来源 """ 模块的三种来源 1.python解释器内置的模块(os.sys....) 2.第三方的别人写 ...

随机推荐

  1. nagios 数据更新不及时的问题

    配置nagios的时候发现一个问题,就是改变了某个主机或者服务的描述之后,在主页信息总是更新很慢,而且告警信息还是老的信息,重启多次 nagios甚至重启主机都没有解决,其实这些都是由于nagios每 ...

  2. Python之Django rest_Framework框架源码分析

    #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_fram ...

  3. 忽略node.js服务中favicon.icon的请求

    场景 一个最简单的node.js的http服务 const http = require('http'); const server = http.createServer(function(req, ...

  4. 12、SEO工程师指南 - 软件项目角色指南系列文章

    第11章       SEO工程师   SEO工程师是一个比较新兴的职位,在实际的项目管理过程中,SEO工程师的地位相对靠后,只有在项目试运行以及运营期间才能体现出SEO工程师的作用.在项目完成之后, ...

  5. 理解JavaScript中的作用域

     什么是变量,什么是作用域? 变量:简单来说就是在特定时间内保存特定值的一个名字而已,由于不存在定义某个变量必须要保存某种数据类型值的规则,所以变量的值及其数据类型可以在脚本生命周期内任意改变,变量可 ...

  6. bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]

    4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...

  7. BZOJ 2653: middle [主席树 中位数]

    传送门 题意: 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右 ...

  8. POJ3335 POJ3130 POJ1474 [半平面交]

    终于写出自己的半平面交模板了....... 加入交点的地方用了直线线段相交判定 三个题一样,能从任何地方看到就是多边形的内核 只不过一个顺时针一个逆时针(给出一个多边形的两种方式啦),反正那个CutP ...

  9. ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql' mysql> use mysql

    show databases;select user,password,host from user;我们想通过 查看存在"mysql"数据库中的user表来查看我们的msql数据 ...

  10. 有关static静态方法知识的收集

    1.何时使用静态方法: 如果某些操作不依赖具体实例,那它就是静态的,反之如果某些操作是依赖具体实例的(例如访问一个特定会员的名称),那它就应该是实例化的. 2.静态方法和实例方法的区别主要体现在两个方 ...