最近身边一些朋友发生在项目当中编写自己模块,导入的时候无法导入的问题。

下面我来分享一下关于python中导入模块的一些基本知识。

1 导入模块时寻找路径

  在每一个运行的python程序当中,都维护了一套sys文件,在这里面的path变量里,存储了在当前程序中导入模块时候寻找的路径。

上代码看一下:

 import sys

 if __name__ == '__main__':
file_path = sys.path
for i in file_path:
print(i)
'''
执行结果:
D:\Workspaces\PycharmProjects
C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\python35.zip
C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\DLLs
C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib
C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35
C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib\site-packages
'''

请让我来 解释一下~

我们导入sys,查看了sys.path。path是一个列表,里边存储了多个路径,这些路径是如果我们进行import 模块操作的时候,python会从这个路径从第一个开始到最后一个一个一个路径去找我们的模块,直到找了或者都没找到,再抛出异常。

如果我们自己写的模块放在奇怪的地方,在程序中import自然是无法为导入的。这个时候怎么办呢??

我们可以向sys.path这个列表的第一个位置里插入一个路径,就是我们自己编写的模块存放的位置。这样python再找的时候就能找到了。

上代码:

 import sys

 if __name__ == '__main__':
sys.path.insert(0, ".\\" ) file_path = sys.path
for i in file_path:
print(i)
'''
执行结果: .\
D:\Workspaces\PycharmProjects
C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\python35.zip
C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\DLLs
C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib
C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35
C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib\site-packages
'''

这一次呢,我们在程序执行之前对sys.path进行了insert( 0 , str) ,这是列表的基本操作,在0号位置插入了str。这个str则是 模块所在的路径

我向里面插入了.\\代表当前路径,在打印结果中.\就占了第一个位置。

有些小伙伴有疑问 我添加的是.\\ 为什么出来的结果是.\

这个问题呢是字符串的转义问题。在编程语言和操作系统中,识别 \ 是有特殊含义的,比如 \n 代表换行  \r 代表回车    \0 代表字符串结束等等。

当解析器遇到\ 他会默认和后面一个字符组合成一个字符。我们输入 \\ 其实是告诉计算机 我们想要输入的是 \ , 这是转义字符的基本概念哦~

2 模块的重导入

  有的时候,我们程序在运行着,然后我们改变了程序内用到的模块的一些内容,但是程序运行结果没有按照我们修改的模块内容改变。

  这个时候 即使我们再import 模块   运行结果还是没有改变。

  这个时候要普及一下python解释器导入模块的一些基础知识:

  当第一次import 模块 的时候,这个模块就常驻内存了,代码等都已经复制过来。每次调用模块方法的时候不会再去找模块内的代码,而是在内存中直接使用。所以当我们修改模块内代码,程序运行结果没有变,因为程序只导入了一次模块,并且记住里面所有东西。之后调用模块方法全凭内存内的记忆!

  即使我们再import 模块,python认为 我的内存当中有这个模块我们已经导入过了,就会忽略这个语句,不会导入了。

  那怎么办呢????

  这时候我们需要使用模重导入:

 import imp
imp.reload(a) #把我们要重新导入的模块a进行重新导入
a.a()

这样就ok啦! 更新了内存当中之前导入的模块啦!

python中导入模块的本质, 无法导入手写模块的解决办法的更多相关文章

  1. Python中ValueError: invalid literal for int() with base 10 的实用解决办法

    爬虫代理IP由芝麻HTTP服务供应商提供今天在写爬虫程序的时候由于要翻页,做除法分页的时候出现了 totalCount = ' totalPage = int(totalCount)/20 Value ...

  2. Python中,os.listdir遍历纯数字文件乱序如何解决

    Python中,os.listdir遍历纯数字文件乱序如何解决 日常跑深度学习视觉相关代码时,常常需要对数据集进行处理.许多图像文件名是利用纯数字递增的方式命名.通常所用的排序函数sort(),是按照 ...

  3. IOS 开发中 Whose view is not in the window hierarchy 错误的解决办法

    在 IOS 开发当中经常碰到 whose view is not in the window hierarchy 的错误,该错误简单的说,是由于 "ViewController" ...

  4. 向SDE图层中添加大量数据时,出现ORA-00604以及ORA-01000的解决办法

    转自原文 向SDE图层中添加大量数据时,出现ORA-00604以及ORA-01000的解决办法 写了一个小程序,从一个列表中读取坐标串,每个坐标串生成一个IPolygon,然后将这些Polygon添加 ...

  5. ie、firefox、chrome中关于style="display:block" 引发的页面布局错乱的解决办法

    ie.firefox.chrome中关于style="display:block" 引发的页面布局错乱的解决办法: table中tr 添加style="display:b ...

  6. Bootstrap中关闭第二个模态框时出现的问题和解决办法

    Bootstrap中关闭第二个模态框时出现的问题和解决办法 1.关闭第二个模态框时,第一个模态框跟着消失. 解决办法: 第二个模态框的代码不要写在第一个模态框里面,确保两个模态框相对独立; 2.关闭第 ...

  7. VMware虚拟机中的CentOS7安装Nginx后本机无法访问的解决办法

    VMware虚拟机中的CentOS7安装Nginx后本机无法访问的解决办法 在linux上安装nginx 请参考:Linux Centos7 安装 nginx 在虚拟机centos7上安装nginx之 ...

  8. [转]python中对文件、文件夹的操作——os模块和shutil模块常用说明

    转至:http://l90z11.blog.163.com/blog/static/187389042201312153318389/ python中对文件.文件夹的操作需要涉及到os模块和shuti ...

  9. python中使用pip安装报错:Fatal error in launcher... 解决方法

    python安装了2和3版本在 cmd 中用pip报的错误为:Fatal error in launcher:Unable to create process using 这是因为你安装了python ...

随机推荐

  1. WP Super Cache+七牛云配置CDN加速,让你的网站秒开

    CDN加速网站是几乎所有的站长都在考虑的问题,CDN,全称是Content Delivery Network,即内容分发网络.所谓CDN加速,通俗的来说就是把原服务器上数据复制到其他服务器上,用户访问 ...

  2. 【Unity3D与23种设计模式】游戏的主循环——Game Loop

    游戏与其他软件最大的不同 就是游戏有Update逻辑 一般的软件是由"事件"驱动 因为它不会突然跑出来一只"兔子" 因此,只有游戏才有"帧" ...

  3. openstack中的环境准备

    openstack中环境准备基于Ubuntu系统 author:headsen chen   2017-10-13  11:51:50 个人原创,转载请注明作者,出处. 6 apt-get insta ...

  4. Linux设备驱动故障定位指引与实例

    Linux设备驱动故障定位指引 Linux设备驱动种类繁多,涉及的知识点多,想写一个通用的故障定位方法指引,是个难度颇大且不容易做好的工作.限于笔者的经验,难以避免存在疏漏之处,欢迎大家留言指正补充. ...

  5. python中干掉tornado的连接失败日志

    用了tornado真的是比较舒服,很多事都为你做好了. 但也有不令人满意的地方--对于我这个洁癖来说,自动给我的控制台打印不受我控制的信息是不能忍受的. 连接到一个新的地方,如果失败,tornado会 ...

  6. js中==和===区别

    简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢, 这么理解: 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换 ...

  7. 18.C++-[ ]操作符使用 、函数对象与普通函数区别(详解)

    在上章17.C++-string字符串类(详解)学习了string类,发现可以通过[ ]重载操作符来访问每个字符. 比如: string s="SAD"; for(int i=0, ...

  8. Java并发系列[9]----ConcurrentHashMap源码分析

    我们知道哈希表是一种非常高效的数据结构,设计优良的哈希函数可以使其上的增删改查操作达到O(1)级别.Java为我们提供了一个现成的哈希结构,那就是HashMap类,在前面的文章中我曾经介绍过HashM ...

  9. Vue 知识复习(上)

    Vue Vue实例 创建实例: var vm = new Vue({ //code }) 数据与方法: 只有当实例被创建时 data 中存在的属性才是响应式的; Vm.b = 'h1' 是不会触发视图 ...

  10. 第 8 章 IO库

    第 8 章 IO库 标签: C++Primer 学习记录 IO库 第 8 章 IO库 8.1 IO类 8.2 文件输入输出 8.1 string流 8.1 IO类 IO对象无拷贝或赋值,因此不能将形参 ...