python中导入模块的本质, 无法导入手写模块的解决办法
最近身边一些朋友发生在项目当中编写自己模块,导入的时候无法导入的问题。
下面我来分享一下关于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中导入模块的本质, 无法导入手写模块的解决办法的更多相关文章
- Python中ValueError: invalid literal for int() with base 10 的实用解决办法
爬虫代理IP由芝麻HTTP服务供应商提供今天在写爬虫程序的时候由于要翻页,做除法分页的时候出现了 totalCount = ' totalPage = int(totalCount)/20 Value ...
- Python中,os.listdir遍历纯数字文件乱序如何解决
Python中,os.listdir遍历纯数字文件乱序如何解决 日常跑深度学习视觉相关代码时,常常需要对数据集进行处理.许多图像文件名是利用纯数字递增的方式命名.通常所用的排序函数sort(),是按照 ...
- IOS 开发中 Whose view is not in the window hierarchy 错误的解决办法
在 IOS 开发当中经常碰到 whose view is not in the window hierarchy 的错误,该错误简单的说,是由于 "ViewController" ...
- 向SDE图层中添加大量数据时,出现ORA-00604以及ORA-01000的解决办法
转自原文 向SDE图层中添加大量数据时,出现ORA-00604以及ORA-01000的解决办法 写了一个小程序,从一个列表中读取坐标串,每个坐标串生成一个IPolygon,然后将这些Polygon添加 ...
- ie、firefox、chrome中关于style="display:block" 引发的页面布局错乱的解决办法
ie.firefox.chrome中关于style="display:block" 引发的页面布局错乱的解决办法: table中tr 添加style="display:b ...
- Bootstrap中关闭第二个模态框时出现的问题和解决办法
Bootstrap中关闭第二个模态框时出现的问题和解决办法 1.关闭第二个模态框时,第一个模态框跟着消失. 解决办法: 第二个模态框的代码不要写在第一个模态框里面,确保两个模态框相对独立; 2.关闭第 ...
- VMware虚拟机中的CentOS7安装Nginx后本机无法访问的解决办法
VMware虚拟机中的CentOS7安装Nginx后本机无法访问的解决办法 在linux上安装nginx 请参考:Linux Centos7 安装 nginx 在虚拟机centos7上安装nginx之 ...
- [转]python中对文件、文件夹的操作——os模块和shutil模块常用说明
转至:http://l90z11.blog.163.com/blog/static/187389042201312153318389/ python中对文件.文件夹的操作需要涉及到os模块和shuti ...
- python中使用pip安装报错:Fatal error in launcher... 解决方法
python安装了2和3版本在 cmd 中用pip报的错误为:Fatal error in launcher:Unable to create process using 这是因为你安装了python ...
随机推荐
- Android 的自动化测试资源
环境预备阶段: win7下jdk+eclipse android应用开发环境建立 android genymotion模拟器怎么使用以及和google提供的模拟器性能对比
- 元素化设计原理及规则v1.0
一.元素设计架构 元素设计架构展示在基于元素化设计的思想下,系统各元素之间如何相互协作,并完成整个系统搭建. 架构中以Entity(数据)为中心,由Entity产生数据库表结构,并且Entity作为业 ...
- AIX分页(交换)空间的监控
1.分页和交换 这两个概念,很多人混为一回事儿,两者虽然有共性,但也有些差别.分页是进程的部分内容在RAM和磁盘的分页空间间移动,而交换是整个进程在RAM和磁盘的分页空间间移动,在将进程移到磁盘分页空 ...
- 安装Oracle11g的依赖包
binutils-2.17.50.0.6 compat-libstdc++-33-3.2.3 elfutils-libelf-0.125 elfutils-libelf-devel-0.125 elf ...
- GEETEST极验召集互联网大佬齐聚光谷,共同探讨交互安全问题
全球互联网技术在飞速发展的同时,网络安全事件也随之频发.除了直接带来经济损失的网络恶意攻击之外,企业在多个方面也遭受着不同程度的网络恶意攻击,包括品牌形象.管理时间.企业竞争力.客户成交量.用户行为等 ...
- 浅谈TCP三次握手和四次挥手
学习三次握手和四次挥手前,先了解下几个基础的概念. Seq:数据段序号,我们都知道TCP是提供有序传输的,有序传输的基础就是数据段序号,接收方在收到发送方乱序包的情况下可以根据Seq进行重新排序,确保 ...
- Linux chgrp命令
在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...
- JVM学习五:JVM之类加载器之编译常量和主动使用
在学习了前面几节的内容后,相信大家已经对JAVA 虚拟机 加载类的过程有了一个认识和了解,那么本节,我们就继续进一步巩固前面所学知识和特殊点. 一.类的初始化回顾 类在初始化的时候,静态变量的声明语句 ...
- 【Python】 MySQLdb的安装与使用
MySQLdb MySQLdb是一款较为底层的,python连接mysql用的模块.和更加高级的,提供ORM的模块不同,MySQLdb主要还是聚焦于如何和数据库进行连接和进行基本的操作,操作的体现形式 ...
- Algorithm --> 邮票连续组合问题
邮票组合问题 有四种面值的邮票很多枚,面值分别为1,4,12,21,取五张,求取出这些邮票的最大连续组合值 代码: #include <stdio.h> #include <stri ...