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. CSS——类和ID选择器的区别

    1.相同点,可以应用在任何元素. 2.不同点,ID选择器只能在元素里只能分别引用,不能同时引用. 如: <style type="text/css">.stress{( ...

  2. TensorflowTutorial_二维数据构造简单CNN

    使用二维数据构造简单卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 图像和一些时序数据集都可以用二维数据的形式表现,我们此次使用随机分布的二位数据构造一个简单的CNN-网络卷积- ...

  3. 《收藏》对servlet原理讲解特别详细

    转载:http://blog.csdn.net/javaloveiphone/article/details/8154791 内容: 一.先从servlet容器说起:大家最为熟悉的servlet容器就 ...

  4. 洛谷 [P2701] 巨大的牛棚

    首先,本题是一道最大子矩阵问题,且m,n较小,可以使用DP做, 与 洛谷 [P1387]最大正方形 做法相同. #include <iostream> #include <cstdi ...

  5. HDU 2865 Birthday Toy [Polya 矩阵乘法]

    传送门 题意: 相邻珠子不能相同,旋转等价.$n$个珠子$k$中颜色,求方案数 首先中间珠子$k$种选择,$k--$如果没有相邻不同的限制,就和$POJ\ 2154$一样了$|C(f)|=k^{\#( ...

  6. BZOJ 1486: [HNOI2009]最小圈 [01分数规划]

    裸题...平均权值最小的环.... 注意$dfs-spfa$时$dfs(cl)$...不要写成$dfs(u)$ #include <iostream> #include <cstdi ...

  7. C#小笔记:单例模式

    双重锁定: public class Singleton { private static Singleton instance; private static readonly object syn ...

  8. [记录]Shell中的getopts和getopt用法

    Shell中的getopts和getopt用法 1.getopts getopts(shell内置命令)不能直接处理长的选项(如:--prefix=/home等),getopts有两个参数,第一个参数 ...

  9. eclipse快捷注释生成方法

    自动生成方法的注释格式,例如 /*** @param str* @return* @throws ParseException*/ 快捷键是alt+shift+j,将光标放在方法名上,按快捷键.会生成 ...

  10. iptables转发备忘

    iptables -F sysctl net.ipv4.ip_forward=1 iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8766 - ...