系统:win10(linux系统也是类似的方法)
python:3.8.3

正文

python import 的搜索方法

在python中,有模块(module)和包(package)这两个概念。
一个.py文件就是一个模块;一个包含__init__.py文件的文件夹就是一个包,也就是模块的集合

python在import时,会从指定的路径中去搜索包。其中有一些是搜索路径的基准。
在终端中利用命令:python -c 'import site;print(site.getsitepackages())'来查看基准路径:

['C:\\Users\\username\\AppData\\Local\\Programs\\Python\\Python38',
'C:\\Users\\username\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages']

然后,可以利用sys.path查看目前所有的搜索路径:

import sys
for path in sys.path:print(path)

我的输出如下:

d:\Computer_Programming\python\test
C:\Users\username\AppData\Local\Programs\Python\Python38\python38.zip
C:\Users\username\AppData\Local\Programs\Python\Python38\DLLs
C:\Users\username\AppData\Local\Programs\Python\Python38\lib
C:\Users\username\AppData\Local\Programs\Python\Python38
C:\Users\username\AppData\Roaming\Python\Python38\site-packages
C:\Users\username\AppData\Local\Programs\Python\Python38\lib\site-packages
......

可以看到,其中比基准路径多了很多其他的路径。
第一个是我们的当前路径,python会优先搜索我们当前路径下的包和模块。剩下的也都是python import时的搜索路径

注意

sys.path输出的路径的前后顺序就是python搜索包的前后顺序,这一点一定要注意。

比如,我们修改了python38路径下的一个名为mypackage的包文件夹,但是在python38\lib路径下也有一个同名的包,此时无论怎么修改python38路径下的那个包的内容,最后都影响不到import mypackage,因为python使用的一直都是python38\lib路径下的那个mypackage包


添加和使用自己写的python包

假设我们python包的结构为:

mypackage
--__init__.py
--submodule.py

关于__init__.py文件的使用,以及import … 和 from … import …的说明,见另一篇文章

我们自己写的python包所放的位置有多种选择:

方法一

把mypackage文件夹放在当前路径下,则在当前路径下的.py文件中可以直接:import mypackage。但是这种方法很不方便,如果在另一个路径下写.py文件的话,就得重新copy一份mypackage文件夹到另一路经下。

方法二(使用pth文件)

我们还可以把mypackage文件夹放在任意路径下,比如我放在:d:\Computer_Programming 下。
然后,我们就可以在上述的两个基准路径的其中一个下添加一个.pth文件,文件名任意。内容就是mypackage文件夹所在的路径,即 d:\Computer_Programming:

然后可以进行验证:

import mypackage
print(mypackage.__file__) # 查看mypackage包的路径
输出如下:
D:\Computer_Programming\mypackage\__init__.py再用sys.path查看下搜索路径,就可以发现,输出中已经包含 d:\Computer_Programming 路径

方法三(不使用pth文件,常见)

我们还可以把mypackage文件夹放在上述sys.path输出的任一路径下。不过一般放在 ...\Python38\lib\site-packages 这个路径下,因为这个路径下存放的都是第三方包和模块,打开之后可以看到,很多我们安装的第三方包和模块都在这里;
而另一个常见的...\Python38\lib路径下存放的都是内置的包和模块。

所以,把mypackage文件夹放到 ...\Python38\lib\site-packages 路径下,之后不需要.pth文件,就可以直接使用:import mypackage
进行验证:

import mypackage
print(mypackage.__file__) # 查看mypackage包的路径
此时输出如下:
C:\Users\username\AppData\Local\Programs\Python\Python38\lib\site-packages\mypackage\__init__.py
附注

我在windows中,尝试了只将mypackage文件夹的快捷方式(类似于linux下的软链接,因为不想把整个文件夹都copy过去)放在基准路径下,其他一样,最后发现行不通,import mypackage就会报错:

Traceback (most recent call last):File "d:\Computer_Programming\python\test\test.py", line 3, in <module>import mypackage
ModuleNotFoundError: No module named 'mypackage'

但是linux系统中,只把创建的指向mypackage的软链接放在基准路径下的话,仍然可以正常使用mypackage包

参考

site的官方文档:https://docs.python.org/zh-cn/3/library/site.html

python import 搜索包路径的机制,以及添加自定义python包的方法相关推荐

  1. python 3d游戏记录路径_基于osg的python三维程序开发(五)------沿路径运动

    在上一节中, 我们演示了如何更新节点的状态, 这是动画的基本的技巧. 这一小节里,我们看一个稍微复杂一点的例子------让物体沿着固定的路径运动. 在osg 中,使得物体沿着固定路径运动, 会用到几 ...

  2. 获取 python import模块的路径

    import a_module print a_module.__file__ 上述代码将范围 .pyc 文件被加载的路径,如果需要跨平台解决方案,可用下面代码: import os path = o ...

  3. python保存模型的路径怎么写_使用python在MongoDB中保存机器学习(ML)和深度学习(DL)模型...

    我们知道,当我们训练机器学习或深入学习模型时,我们必须保存训练过的模型,以便将来进行预测.现在的训练模型非常昂贵,所以如果我们能够保存它们并将其用于解决其他一些问题.例如,一个训练过的能够识别汽车的神 ...

  4. python 全文搜索 句子_python新玩法:用python进行文章摘要拿取,只需要一行代码

    前言 今天为大家介绍一个python算法TextRank,实现从长篇中快速抽取精准摘要. TextRank是一种基于图形的文本处理排序算法.PageRank通常用作其底层的图排序模型.当然,其他的图排 ...

  5. Java 扫描并加载包路径下class文件

    背景 用过spring框架之后,有个指定扫描包路径,然后自动实例化一些bean,这个过程还是比较有意思的,抽象一下,即下面三个点 如何扫描包路径下所有的class文件 如何扫描jar包中对应包路径下所 ...

  6. java 加载class文件路径_动手实现MVC: 1. Java 扫描并加载包路径下class文件

    背景 用过spring框架之后,有个指定扫描包路径,然后自动实例化一些bean,这个过程还是比较有意思的,抽象一下,即下面三个点 如何扫描包路径下所有的class文件 如何扫描jar包中对应包路径下所 ...

  7. slf4j-log4j12加log4j自定义配置包路径日志输出

    项目日志在定位问题原因上起着重要的作用,有用的日志输出能提高解决问题的效率,所以日志配置还是很关键的,对一个项目来说有用的日志包路径一般都是项目自己包路径下的日志,集成的框架和依赖包中的包路径下的日志 ...

  8. python包路径有几个_python的搜索路径与包(package)

    python的搜索路径其实是一个列表,它是指导入模块时,python会自动去找搜索这个列表当中的路径,如果路径中存在要导入的模块文件则导入成功,否则导入失败: >>> imports ...

  9. python模块使用相对路径还是绝对路径、哪种更好_python学习的第十八天模块之包、相对搜索路径和绝对搜索路径...

    一.包 1.什么是包 包是一种通过使用'.模块名'来组织python模块名称空间的方式.具体就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起 ...

  10. 探究 python import机制、module、package与名字空间

    在开始之前,先了解一个内置函数dir(),它可以帮助我们分析一些内部的东西,dir()的描述是: dir(): 函数不带参数时,返回当前范围内的变量.方法和定义的类型列表:带参数时,返回参数的属性.方 ...

最新文章

  1. 算法基础知识科普:8大搜索算法之红黑树(中)
  2. 总结|ORB_SLAM2源码中字典使用细节
  3. (转)Ext与.NET超完美整合 .NET开发者的超级优势
  4. 为什么会有这么多python?其实python并不是编程语言!
  5. 常用查找算法(顺序、折半、二叉树、哈希、分块)介绍
  6. 基于easyui开发Web版Activiti流程定制器详解(二)——文件列表
  7. 黑色精美Mxone电影先生在线影视网站源码 苹果cmsV10模板
  8. vim编辑器学习记录
  9. 一道不知道哪里来的容斥题
  10. 如何测网络稳定性_讲座|复杂网络上的非线性动力学:网络结构如何决定系统稳定性?...
  11. 魔都职场外卖(加班)大赏
  12. @Profile 注解的介绍
  13. 最新官方新浪短网址API接口分享-附代码调用演示
  14. 如果你突然打了个喷嚏,那
  15. Live800:企业必修课|新时代的全渠道营销解析(上)
  16. ArcEngine实现要素类排序的四种方法
  17. 【微信红包】恭喜发财,大吉大利
  18. JAVA基础算法练习(5):行星碰撞
  19. php安装和环境配置
  20. Python 爬虫 批量下载论坛图片

热门文章

  1. 最小二乘支持向量机分类器(LSSVM)及Python实现
  2. [Android][Kernel]基于crash工具搭建分析ramdump的平台
  3. oj1029统计素数并求和
  4. Matlab中的两种曲线平滑函数
  5. 基于multisim的zcs电路仿真
  6. 蓝鸽集团云计算机,‎App Store 上的“蓝鸽教育云”
  7. 用计算机控制神舟十号,整理后的计算机控制系统复习题答案
  8. Ubuntu18.04下部署Honeyd蜜罐(完整过程)
  9. 【微弱瞬态信号检测】混沌背景下微弱瞬态信号的SVM检测方法的matlab仿真
  10. 【专升本计算机】计算机文化基础练习题(选择题300道附答案)