很多东西似懂非懂,或者当时看懂了,但是感觉不是很重要,经常不用,时间久了,也就变得似懂非懂了。今天被某度电话面试问道一个问题,就是模块倒入,其实我之前也是很仔细的研究过的,不过由于平时做的东西太简单,用不到模块倒入。

大致对话如下:

面试官:你了解python中模块么?自定义的模块是什么样子的?

我:模块就是把经常要用到的函数,类,常量写到一个文件夹下的python文件中,然后去调用

面试官:那自定义的模块怎么倒入呢

我:直接 import 包名.模块名

面试官:你说的是java吧,python也叫包名?难道不是路径名?

我:对,是路径名,就是路径名中斜杠换成了点。

面试官:那为什么os,sys这些包不想要导入你说的包名

我:那些模块已经在python自己的路径里了,所以不需要,具体是什么路径我记不清了

。。。。

这个模块导入问题我之前是很清楚的,但是感觉没用,就选择性的忘记了,结果今天被这个问题绊了个跟头

正文:

python倒入模块顺序如下:可以用sys.path去查看,返回的是一个列表,就是python的模块查找顺序,也就是说如果你自己的模块路径在sys.path里出现了,那么就可以直接倒入模块名

1. 程序所在的文件夹
2. 标准库的安装路径
3. 操作系统环境变量PYTHONPATH所包含的路径

因为os,sys等模块在python的安装路径下,所以需要倒入路径,后期用easy_install 或者pip安装的模块也已经安装路径里了,所以也不需要倒入路径。

从上面的查找模块顺序我们就可以知道有两种方法去导入外部模块,1.通过文件夹方法,此种方法当文件路径较长时,多次倒入时会显得很麻烦,2.通过设置python的环境变量PYTHONPATH,次方法相当于将你的模块变成标准库中的模块,注意,是相当于,就会死说导入模块时也是直接倒入模块名。

先来看方法1:

比如,我做的例子:都在/home/xx/python/test

------  __init__.py  (此文件可以为空,它的存在只是为了说明这是一个python模块,当然没有此文件就不能成功倒入此文件夹下的模块到其他的python文件中)

-------Human.py

-------HumanTest.py

-------fibTest.py

-------/student/                      (test文件夹下的student文件夹)

----------__init__.py

----------Student.py

-----------fib.py

------------HumanTest.py

情况1:需要导入的模块在同一个文件夹中,比如HumanTest.py调用Human模块,就直接  import Human,因为python解释器查找模块时会找同一文件夹,所以不用导入路径名。

情况2:需要导入的文件在文件夹的子文件夹中,比如fibTest.py调用student文件夹下的fib模块,则 from student.fib imorpt fib,无需加其他路径说明,因为student也是一个模块(模块的集合)

但是要特别说明一下,我做例子的时候犯了一个错误:Student.py中导入了Human模块,为了少几个文件,我直接在Human.py中又去导入Student模块,结果当然是错误的,因为循环导入了,不过一般不会犯这种错误。

情况3:需要导入的模块在父文件夹中,比如Stuent.py要导入Human模块,此时要注意,不能直接import test.Human  ,因为解释器找模块只会去本文件夹及本文件夹的子文件夹去找,不会去父文件夹找。。。那怎么办,只能将父文件夹的路径加在sys.path里了

所以,在Student导入Human时应该这样,首先import sys ,sys.path.append(“..”),然后再导入Human模块,import Human

这种情况可以推广一下,就是所有的导入其实都可以这么做,情况1和情况2也可以这么做,不过也是多次一举,适合导入的模块在其他不相关的我文件下。在前两后写上:import sys,  sys.path.append("path"),  import yourModule   其中path是youModule的文件夹路径。

再看方法2:

就是添加python环境变量。export PYTHONPATH=path                            ,此处path也是你的模块的父文件夹,至于怎么export环境变量可以查看linux的 export。这种方法显然会方便很多,推荐使用。

我的例子都是在ubuntu做的,windows中方法1没有问题,方法2设置python环境变量可以查看windows设置环境变量的方法,不再赘述。

python 模块化管理,导入自己的模块(包)的更多相关文章

  1. Python全栈之路----常用模块----包及跨模块导入

    当你的模块文件越来越多,就需要对模块文件进行划分,比如把负责跟数据库交互的都放一个文件夹,把与页面交互相互的放入一个文件夹. 像上面这样,一个文件夹管理多个模块文件,这个文件夹就被称为包. 那不同包之 ...

  2. Python札记 -- 使用easy_install进行模块/包管理

    今天在阅读以前项目代码时,发现里面使用的第三方模块的参数相当诡异,总是对不上.经过分析之后,发现是自己安装的第三方模块跟项目使用的版本不一致.在Python中进行模块/包管理的话,就不得不提到easy ...

  3. 使用easy_install进行模块/包管理

    使用easy_install进行模块/包管理 今天在阅读以前项目代码时,发现里面使用的第三方模块的参数相当诡异,总是对不上.经过分析之后,发现是自己安装的第三方模块跟项目使用的版本不一致.在Pytho ...

  4. Python 进阶_模块 & 包

    目录 目录 模块的搜索路径和路径搜索 搜索路径 命名空间和变量作用域的比较 变量名的查找覆盖 导入模块 import 语句 from-import 语句 扩展的 import 语句 as 自动载入模块 ...

  5. Python学习day17-常用的一些模块

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  6. Python 模块化 模块搜索顺序、重复导入、模块加载列表(五)

    模块搜索顺序.重复导入.模块加载列表 0x00 模块搜索顺序: 举例: #test.py import sys for p in sys.path: print(p) 运行结果: C:\python ...

  7. Python进阶-XIII 导入模块和包 异常处理

    一.模块的导入 1).import # 测试一:money与my_module.money不冲突 import my_module money=10 print(my_module.money) '' ...

  8. python进阶(3):模块和包

    之前两天我们介绍了一些比较常用的模块,而我也说过会讲解什么是模块,今天我们就来分析分析模块和包,模块我们现阶段使用还可以而包的话现阶段我们基本很少会用到包,学的不是很清楚也没关系这些东西都是用的多了也 ...

  9. Python【第四课】 模块 and 包

    本篇内容 模块基础和导入(import,from...import...) 包常识和导入(import,from...import...) 函数式第一类对象 1.模块基础和导入 1.1 模块认识 什么 ...

随机推荐

  1. 【分布式计算】30分钟概览Spark分布式计算引擎

    本文主要帮助初学者快速了解Spark,不会面面俱到,但核心一定点到. Spark是继Hadoop之后的下一代分布式内存计算引擎,于2009年诞生于加州大学伯克利分校AMPLab实验室,现在主要由Dat ...

  2. 01_re正则表达式

    正则表达式,是一个特殊的字符串, 是对一类字符串的描述 ( 怎么描述一类字符: 普通字符+元字符+重复)检测给定的字符串,是否和正则表达式描述的字符串相匹配 举例:1) 检查一串数字是否是电话号码2) ...

  3. Python代码规范与命名规则

    1.模块 模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况) # 正确的模块名 import decoder import html_parser # 不推荐的模 ...

  4. 【Jmeter】Linux(Mac)上使用最新版本Jmeter(5.0)做性能测试

    本文我们一起来学习在Linux(Mac)上利用Jmeter进行性能测试并生成测试报告的方法. 环境准备 JDK 访问这个地址 [JDK11.01],根据实际环境下载一个JDK. Jmeter Jmet ...

  5. Codeforces 580A - Kefa and First Steps

    580A - Kefa and First Steps 思路:dp dp[i]表示包括前i个元素中a[i]在内的最大增序列. 代码: #include<bits/stdc++.h> usi ...

  6. Python 爬虫-正则表达式(补)

    2017-08-08 18:37:29 一.Python中正则表达式使用原生字符串的几点说明 原生字符串和普通字符串的不同 相较于普通字符串,原生字符串中的\就是反斜杠,并不表达转义.不过,字符串转成 ...

  7. Greengenes Database(16S)

    The Greengenes Database Release 13_5 这是16S的一个非常重要的数据库 The Greengenes Database, a public resource sin ...

  8. 12月13日 什么是help_method,session的简单理解, find_by等finder method

    helper_method Declare a controller method as a helper. For example, helper_method :link_to def link_ ...

  9. Confluence 6 启用嵌套用户组

    一些目录服务器能够允许你在一个组中定义另外一个组.在这种结构下的用户组称为用户组嵌套.嵌套组的配置能够让子用户组继承上级用户组的权限,使系统的权限配置变得简单. 这个页面描述了 Confluence ...

  10. Confluence 6 为用户管理连接 Confluence 到 Crowd

    你可以连接你的 Confluence 应用程序到 Atlassian Crowd 或 a Jira (5.3 及后续版本)来管理你的用户和用户组以及针对他们的授权. Atlassian Crowd 是 ...