python项目内import其他内部package的模块的正确方法

STM32CubeMX之定时器输入捕获 上一章介绍了STM32定时器的PWM输出功能,定时器的几个通道除了有输出功能外,还可以做输入用,可捕获信号的上升沿或下降沿,可以用于测量信号的频率、周期、占空比等。本篇文章将介绍用STM3... 阅读详情

原文出处:https://blog.youkuaiyun.com/u011089523/article/details/52931844

本文主要介绍如何在一个Python项目中,优雅的实现项目内各个package的模块(module)之间的相互引用。

之所以写这篇文章,是因为网上流传的各种奇技淫巧简直五花八门(包括stackoverflow等知名社区),极易误导对python的import机制不熟悉的人。比如我就曾一度因为找不到优雅的import方式,而认为python是一门愚蠢的语言。所以,我把近一上午的学习结果总结出来,希望大家不要误入歧途。

本文参考了如下两篇博客: 
habnab关于python package的精彩总结:地址点我 
Jean-Paul Calderone关于python项目结构的建议:地址点我

demo project

本文以一个demo project为例,来介绍python的包管理机制。

这个demo project我放到github上了:地址点我

其中,项目根目录有三个文件夹:

  • data:存放项目数据
  • doc:存放项目文档
  • package:一个demo python package

其中,package中的文件结构如下图: 
项目结构

python package

基础知识

当你import的时候,python只会在sys.path这个变量(一个list,你可以print出来看)里面的路径中找可能匹配的package和module。

而一个package跟一个普通文件夹的区别在于,package的文件夹中多了一个__init__.py文件。换句话说,如果你在某个文件夹中添加了一个__init__.py文件,则python就认为这个文件夹是一个package。

__init__.py文件可以是空的(也推荐者这么做),它只是告诉python当前文件夹是一个package。当然,也可以在里面添加一些代码,这些代码会在import这个包的时候运行。

所以,请确保你要import的文件所在的文件夹有__init__.py文件(除非它在sys.path中某个文件夹下)。

错误的import做法

如上述project中,如果你想让subpackage2中的foo2来import subpackage1中的foo1,便会出现找不到subpackage1的情况。

目前网络上大部分的做法都是通过sys.path.append(yourpath)之类的方法,将你需要import的module的目录添加到sys.path中。或者,通过修改PYTHONPATH这个环境变量来将添加(跟修改sys.path效果相同)。

但是,这种做法有如下几个缺点:

  • 如果你用PYTHONPATH,那么当有多个项目时,你需要把每个项目的根目录都加入到PYTHONPATH中,会使得PYTHONPATH变得十分臃肿
  • 如果你使用sys.path,由于文件夹是动态添加的,所以当你使用相对路径的时候,实际路径会十分依赖于你的入口函数,当入口函数改变很可能就会导致代码无法运行
  • 如果你使用绝对路径,将你的代码在其他机器上运行的时候需要重新配置这些变量,十分麻烦

正确的做法

代码中正常import

首先,在代码中按照正常方式导入你需要的包

比如,你需要在app.py中导入foo1,则:

from package.subpackage1 import foo1 

虽然你可能发现from subpackage1 import foo1也可以正常运行,但是请避免这种使用相对路径的方法。因为这在python3中将不再支持,同时也有可能会引起奇怪的问题。同时,虽然PEP 328中也给出了 from .subpackage1 import foo1这样的形式,但是还是不要自己给自己制造麻烦,统一使用完整路径(绝对路径)为好。

再比如,如果你需要在foo2.py中导入foo1.py(在不同的subpackage中),则:

 

from package.subpackage1 import foo1

跟上面一模一样,这就是使用绝对路径的好处,各处的引用高度统一。同时,如果你的package被安装在其他用户的机器中,其他用户也会使用这种绝对路径来import你package中的模块(回想你自己import第三方package的情景)。

创建__main__.py文件

在package的根目录中创建__main__.py文件,可以使得你的package可以通过python -m直接运行。

demo中的__main__.py文件十分简单:

from package.app import main

main()


即import真正的主函数app.py中的main方法,然后调用main()

用python -m运行你的python文件

python的-m参数官方说法是: 
Searches sys.path for the named module and runs the corresponding .py file as a script.

在下面的例子中,加上-m参数后,所运行的.py文件便会识别其顶层的package

回到刚才的例子。创建完__main__.py之后,cd到项目的根目录,运行

python -m package

即可实现直接运行__main__.py,即直接运行了package这个包

如果你想直接运行package内的某个.py文件,比如foo1,则:

 

python -m package.subpackage1.foo1


当然,你要确保foo1中存在判断其是否是入口函数的逻辑,如下:

if __name__ == "__main__":

    speak()

总结

至此,我们已经实现了你所希望的所有功能:

  • 在project内部实现各个模块之间的import
  • project中的各个.py文件可以直接运行
  • 将project迁移到其他机器时,不用进行额外配置

如果还有不明白的,可以将github上的源码下载下来看一看,然后用python -m运行一下

Android 13 Settings蓝牙列表卡顿问题排查及优化过程 此时我们的卡顿优化基本完成了,我们应该要考虑内存是否会泄漏,如果大家不知道哪些需要回收可以用leakcanary和android profiler进行内存检测,看代码有没有内存泄漏。 阅读详情

相关推荐

实战避坑:在Ubuntu 22.04上配置NVIDIA GPU Direct RDMA时,必须搞清的P2P DMA与IOMMU那些事

本文深入探讨在Ubuntu 22.04上配置NVIDIA GPU Direct RDMA时P2P DMA与IOMMU的关键问题,解析PCIe架构中的地址转换、P2P DMA与标准DMA的区别,以及IOMMU对性能的影响。通过实战案例和调优建议,帮助用户避免常见配置陷阱,提升AI训练集群的数据传输效率。

weixin_33720078的博客 442

python项目内文件引用关系管理

ModuleNotFoundError: No module named 'XXX' ImportError: attempted relative import with no known parent package

Torch_HXM的博客 1528

STM32 热敏电阻测量温度

1、硬件 STM32F103C8T6、热敏电阻传感器、OLED。 2、热敏电阻传感器的介绍

weixin_54721788的博客 1万+

Python无法import项目中其它包的问题

办法一: 将你需要被导入的包放在python的site-package文件夹下; 办法二: pycharm项目目录,在该文件夹上:右键 --> Mark Directory as --> Sources ROOT 标记目录为源码目录; 设置后,该文件夹变为蓝色,且不再报错。 办法三: 可能是XXXX包没有新建init.py文件,需要新建一个; 办法四: 如果是不在一个目...

Java Punk 3369

Dify+MCP 双剑合璧:告别知识库模糊统计,让AI精准查询数据库数据!

本文详细介绍了如何通过Dify和MCP的结合,解决知识库在数据库查询中的模糊统计问题。通过MCP中间件将自然语言实时转换为SQL语句,实现精准数据查询,并支持SSE协议持续更新数据。文章包含MySQL环境搭建、MCP服务端部署、Dify工作流配置等实战步骤,帮助用户高效构建智能数据库查询系统。

weixin_33737774的博客 368

高级数据库--作业及答案

中科大金培权老师的高级数据库课程作业及答案

一杯水果茶!足矣~ 1657

python模块调用方法记录及注意事项

需要注意的是,导入其他模块时,Python 会执行这个模块中的全部代码。因此,在导入其他模块时,需要注意模块中的代码和变量的设计和编写方式。因此,将 UpdataWeb.py 改名为 updata_web.py 可以符合 Python 的命名规范,同时其他文件也可以通过。Python 的搜索路径是一个列表,Python 解释器会按照这个列表的顺序去查找要导入的模块。文件,那么 Python 就会将这个目录视为一个包,并将 UpdataWeb.py 视为这个包的一个模块。这样,其他文件就可以通过。

m0_51777056的博客 1136

C/C++跳动的爱心(完整代码)

C语言实现跳动的爱心的完整代码。

AIGC 5842

python中导入模块/包的几种方式

语法:from module_name import class_name, funct_name。使用:package_name.func_name 或者 package_name.class。使用方式:module_name.class_name或者module.func_name。使用:package_name.module_na112afme.func_name或。使用方式:XXX.class_name或者XXX.funct_name。直接导入一个包,仅仅可以使用_init_.py中的全部内容。

Python热爱者的博客 4447

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

努力让自己发光,对的人才能迎着光而来 34万+

数据仓库数据质量监控和处理方法最佳实践

指的是检查数据是否存在反常或者错误的情况,例如数值反常地过大或者过小,或者超过记录的波动值,对应的规则包括数值波动检查,最大值、最小值检查,跨表准确性等。指的是检查数据是否存在缺失的情况,这里的缺失可以是整个数据集的记录缺失,也可以是某个字段记录的缺失,对应的规则包括空值检查,表总行数检查。指的是检查数据是否符合规范,是否按照规定的格式存储,对应的规则包括正则表达式检查,字段长度检查,枚举集合检查,数值范围等。指的是检查哪些数据是重复数据或者数据的哪些属性是重复的,对应的规则例如主键唯一性检查。

大模型大数据攻城狮的专栏 897

python项目下载模块_python项目内import其他内部package的模块的正确方法

本文主要介绍如何在一个python项目中,优雅的实现项目内各个package的模块(module)之间的相互引用。之所以写这篇文章,是因为网上流传的各种奇技淫巧简直五花八门(包括stackoverflow等知名社区),极易误导对python的import机制不熟悉的人。比如我就曾一度因为找不到优雅的import方式,而认为python是一门愚蠢的语言。所以,我把近一上午的学习结果总结出来,希望大家...

weixin_39722188的博客 326

labelImg使用教程

Anaconda环境 安装 Anaconda 之后,在开始菜单下找到 Anaconda 文件夹 找到 Anaconda Prompt 点击运行 安装 labelImg pip install labelImg #直接命令行输入 启动 labelImg labelImg #直接命令行输入名称即可 labelImg界面 开始标注 快捷键:W(创建方框),A(上一张),D(下一张) XML文件示例 <annotation> <folder>夜读</folder>

G果的博客 3万+

python的package里只有三个_python项目内import其他内部package的模块的正确方法

转载 :https://blog.youkuaiyun.com/u011089523/article/details/52931844本文主要介绍如何在一个Python项目中,优雅的实现项目内各个package的模块(module)之间的相互引用。之所以写这篇文章,是因为网上流传的各种奇技淫巧简直五花八门(包括stackoverflow等知名社区),极易误导对python的import机制不熟悉的人。比如我就...

weixin_39699163的博客 226

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【已解决】【VSCode Python同项目内的import问题】在VSCode的Python项目中正确地import同项目下其他package中的module

研究了很久的时间,网上根本没找到合适的解决方案,最后终于解决了这个困扰我已久的问题,这里记录解决方案。 另外,本文还补充了:==在windows上的配置方法。==

the Blog of 等不到天亮丶等时光 4万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

PyCharm项目内import其他内部package的模块的正确方法

最近从svn上下载了一个项目代码,使用PyCharm打开出现了很多的错误提示:No module named ***;之前遇到这个问题都是直接用pip install *** 解决,但是这次倒入的都是项目内部的模块,代码也没错,不知道为啥还会提示错误。后来问了同事前辈,才知道是PyCharm针对项目内导入默认只会查找文件夹内部的文件,不会查找别的文件夹的文件,所以导致找不到模块,出现这个错误提示。...

u010483897的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

项目内import其他内部package的模块的正确方法

主要介绍如何在一个python项目中,优雅的实现项目内各个package的模块(module)之间的相互引用。 之所以写这篇文章,是因为网上流传的各种奇技淫巧简直五花八门(包括stackoverflow等知名社区),极易误导对python的import机制不熟悉的人。比如我就曾一度因为找不到优雅的import方式,而认为python是一门愚蠢的语言。所以,我把近一上午的学习结果总结出来,希望大家

天涯孤狼的博客 1532

Python模块(Package Module)import陷阱

一个Python Module(模块),是一个文件,包含了Python对象定义和Python语句(definitions and statements)。文件名就是模块名加上后缀.py,在模块内部,模块名存储在全局变量__name__中,是一个string,可以直接在module中通过__name__引用到module name。 module是为了重复使用一些对象,比如类,函数,而将这些对象...

taoqick的专栏 906

import自己的python包(package) | 常见import方式及问题解决

问题:在import自己写的package时,总会出现没有module存在的错误! 解决: (1)import方式不正确导致的错误 方式一:import 以上述Cars 这个package以及相应sub package是自己构建的包。要使它们成为一个包,它们都必须包含__init__.py文件,该文件可以是空白的,或者带有一些初始化代码。让我们假设汽车的所有模型都是模块。使用包有助于单独或整体导入任何模块。 假设我们想得到Bmw i8。其语法如下: import Cars.Bmw.x5 当导入一个包或

用途:中英文学习笔记,如有侵权,可评论留言,及时清理;学历:NUS计算机硕士;SYSU地球物理学士 1万+

python 包( package )和模块( module )的创建和引入( import )

**python 包( package )和模块( module )的创建和引入( import )**

1808

Vscode中python的Attempted relative import beyond toplevel package

Vscode中python的Attempted relative import beyond toplevel package1.问题背景2.我的文件格式3.问题所在4. 解决问题 1.问题背景 最近在pycharm中做了一个项目。由于项目比较简单,一直都是用pychram写完后,把文件上传岛服务器端的。最近试了朋友的推荐,采用Vscode远程管理服务器的代码。用Vscode打开后,发现一直出现报...

Love for DeepLearning 1387

Python相对导入:ValueError: attempted relative import beyond top-level package

首先明确,Python相对导入只能在同一package下而言的。 项目结构: server.py文件 #server.py import sys print(sys.path) from pack1.mod1 import func1 from pack1.mod1_1 import func1_1 from pack1.pack2.mod2 import func2 from pa...

wangjinyu124419的博客 4万+

python package module import 完全总结

总结这个python中 package以及module的导入,是遵循下面的文档结构进行的: sound/ Top-level package __init__.py Initialize the sound package formats/ Subpacka

Work Hard, Play Harder! 5845
上一篇: Python zip() 函数
下一篇: Python中的import,from...import以及模块、包、库的概念
春卷同学
博客等级 码龄12年 1668粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值