代码书写在if __name__ == ‘__main__‘前后的区别

if __name__ == '__main__'这个东西,所有见过python代码的程序猿们一定都不会陌生。为方便理解,有人直接把它等同于java中的主函数。我们今天不是为了来探讨它和Java主函数的异同的(因为我已经忘了Java主函数的细节了,也懒得再回顾…),我们今天就谈一下将代码定义在if __name__ == '__main__'前或者后,到底有什么区别

背景介绍

首先,还是介绍下我为什么又想起这个“python初学者”的问题了。背景是这样的:我有个python脚本,在其中起了一个Flask服务,同时在里面还定义了处理中断信号(SIGINT)的语句,具体你可以认为是这样的:

from flask import Flask
import signal
from b import signal_handler  # 导入b.py中定义的signal_handler函数。至于signal_handler里干了啥,其实就是close了一个数据库连接对象app = Flask(__name__)# Flask路由和其他逻辑...if __name__ == "__main__":# 注册信号处理函数signal.signal(signal.SIGINT, signal_handler)  # 处理 Ctrl+Csignal.signal(signal.SIGTERM, signal_handler) # 处理 kill 命令app.run()

如上所示,这段代码极简单,就是起了个Flask服务,然后在使用Ctrl+C或Kill命令干掉该进程时,先执行signal_handler()函数里面定义的事情(就是关闭了一堆数据库连接)

那么问题来了,signal.signal(signal.SIGINT, signal_handler)这段code,应该定义在if __name__ == "__main__"之前还是之后呢?

问题分析

要想明白这个问题,我们只需搞清if __name__ == "__main__"是干嘛的。

在Python中,if __name__ == "__main__"块确定了代码块是直接作为脚本执行,还是被导入到另一个模块中。当模块被直接执行时,__name__变量被设置为"__main__";当模块被导入时,它通常被设置为模块的名称,也就是说,当脚本被作为模块import时,if __name__ == "__main__"后面的代码不会运行

对于signal.signal(...)的调用,它的位置(在if __name__ == "__main__"之前还是之后)会影响信号处理函数注册的时机和上下文:

  1. 如果signal.signal(...)if __name__ == "__main__"之前定义:
    • 这意味着无论模块是被直接执行还是被导入,信号处理函数都会被注册。这可能不是你想要的行为,因为如果a.py被另一个脚本导入,你可能不希望它改变全局的信号处理设置。
  2. 如果signal.signal(...)if __name__ == "__main__"之后定义:
    • 这意味着只有当当前作为主脚本直接运行时,信号处理函数才会被注册。这通常是更安全和更可控的做法,因为它避免了意外地改变导入此模块的其他脚本的信号处理行为。

问题解决

所以说,我们前面的定义位置是正确的。因为只有当直接运行该脚本时,才会执行到app.run(),才会运行Flask服务、才需要在接受到Kill信号时进行处理、才需要让signal.signal(...)定义生效。所以,signal.signal(...)app.run()可以说是同时存在的,那么这两行代码就应该一起放在if __name__ == '__main__'之后

emmm,有时候没遇到一定的场景,确实很难切身体会到一些相对少见用法的意义。比如 __name__的取值,这个相信所有写python的朋友在初学时都看到过对它的解释,但真正在用到它的时候,才会让你理解它存在的意义。所以,最好的学习方式,我猜,就是在实践中学习,而在此之前,首先应该有一个爱刨根问底的精神。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode110.平衡二叉树

之前没有通过的样例 return语句只写了一个 return abs(l-r)<1缺少了 isBalanced(root->left)&&isBalanced(root->right);补上就好了 class Solution { public:bool isBalanced(TreeNode* root) {if(!root){return true;}int lgetHeight(root->left);i…

(学习日记)2024.03.11:UCOSIII第十三节:使用优先级的流程 (持续更新)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

vulntarget-k - 内网渗透

标签 xxl-job rce Spring-Cloud-CVE-2022-22947 nacos auth bypass iox 靶机难度比较简单&#xff0c;都是用用 exp 就好了 拓扑图 网卡设置 首先需要使用虚拟网络编辑器&#xff0c;增加 VMnet1、VMnet2、VMnet3 对三张网卡设置子网 IP VMnet1 192.168.100.0 VMnet2 1…

EM算法详解

EM(Expectation-Maximum)算法也称期望最大化算法,曾入选“数据挖掘十大算法”中,可见EM算法在机器学习、数据挖掘中的影响力。EM算法是最常见的隐变量估计方法,在机器学习中有极为广泛的用途,例如常被用来学习高斯混合模型(Gaussian mixture model,简称GMM)的参数;隐…

SIP-7043 20W SIP网络有源吸顶喇叭

SIP-7043 20W SIP网络有源吸顶喇叭 一、描述 18123651365微信 声卡喊话IP喇叭&#xff0c;IP网络吸顶天花喇叭 SIP-7043VP是我司的一款SIP网络有源吸顶喇叭&#xff0c;具有10/100M以太网接口&#xff0c;内置有一个高品质扬声器&#xff0c;将网络音源通过自带的功放和喇叭…

jpg格式图片怎么生成二维码?扫码看图在线制作方法

多张jpg格式的图片如何做成二维码展示&#xff1f;jpg是现在最常用的一种图片格式&#xff0c;不管是拍摄的照片、设计图片或是其他类型的图片基本上都是这种格式。那么如何将jpg格式的图片放到二维码中展示呢&#xff1f;通过下面的文章内容来分享一下图片制作二维码在线的技巧…

scrcpy远程投屏控制Android

下载 下载后解压压缩包scrcpy-win64-v2.4.zip scrcpy连接手机 1. 有线连接 - 手机开启开发者选项&#xff0c;并开启USB调试&#xff0c;连接电脑&#xff0c;华为手机示例解压scrcpy&#xff0c;在scrcpy目录下打开终端&#xff0c;&#xff08;或添加scrcpy路径为环境变…

前端面试题 ===> 【HTML】

HTML面试题总结 1. 对 HTML 语义化的理解 去掉或者丢失样式的时候能够让页面呈现出清晰的结构&#xff1b;代码结构清晰&#xff0c;方便团队的管理和维护&#xff0c;并且语义化更具有可读性&#xff0c;减少差异化&#xff1b;提升用户体验&#xff1b; 例如&#xff1a;ti…

【数组】41. 缺失的第一个正数【困难】

缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1 输入&#xff1a;nums [1,2,0]输出&#xff1a;3 示例 2 输入&#xff1a;nums [3,4,-1,…

同态滤波算法详解

同态滤波是一种用于增强图像的方法&#xff0c;特别适用于去除图像中的照明不均和阴影。该算法基于照射反射模型&#xff0c;将图像分解为两个分量&#xff1a;照射分量&#xff08;illumination component&#xff09;和反射分量&#xff08;reflection component&#xff09;…

精品基于Uniapp+ssm停车场预约缴费微信小程序的设计与实现

《[含文档PPT源码等]精品微信小程序基于Uniappssm停车场微信小程序的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;ssm 安卓框架&…

Python打印输出Linux中最常用的linux命令之示例

一、Linux中的~/.bash_history文件说明&#xff1a; 该文件保存了linux系统中运行过的命令的历史。使用该文件来获取命令的列表&#xff0c;并统计命令的执行次数。统计时&#xff0c;只统计命令的名称&#xff0c;以不同参数调用相同的命令也视为同一命令。 二、示例代码&am…

csp模拟题(201604-2,俄罗斯方块模拟下坠)

题目 问题描述 俄罗斯方块是俄罗斯人阿列克谢帕基特诺夫发明的一款休闲游戏。   游戏在一个15行10列的方格图上进行&#xff0c;方格图上的每一个格子可能已经放置了方块&#xff0c;或者没有放置方块。每一轮&#xff0c;都会有一个新的由4个小方块组成的板块从方格图的上方…

一文掌握Python控制语句操作及实例详解

在 Python 中,控制语句是用于流程控制的重要工具,可以帮助我们根据不同的条件执行不同的代码块。本文将带你快速掌握 Python 中的控制语句操作,并通过实际例子让你更好地理解。 1. 条件控制语句:if-elif-else Python中的条件判断主要依赖于if,elif(else if)和else语句…

应急响应实战笔记03权限维持篇(6)

0x00 前言 在渗透测试中&#xff0c;有三个非常经典的渗透测试框架----Metasploit、Empire、Cobalt Strike。 那么&#xff0c;通过漏洞获取到目标主机权限后&#xff0c;如何利用框架获得持久性权限呢&#xff1f; 0x01 MSF权限维持 使用MSF维持权限的前提是先获得一个met…

蓝桥集训之正则问题

蓝桥集训之正则问题 核心思想&#xff1a;递归 归结到一棵树 向上返回x数量 #include<iostream>#include<cstring>using namespace std;int k;string str;int dfs(){int res0; //记录x数量while(k<str.size()){if(str[k] (){k ; //跳过左括号res dfs();k …

【C#】【SAP2000】OAPI文档案例详解

创建一个简单的结构模型,运行分析,提取结果,并将结果与手算值进行比较。 以下是详细的代码解析: 开头部分是一些using语句,引用了必要的命名空间,特别是SAP2000v1, 它包含了SAP2000 API的类和方法。 在Main方法中,首先定义了一些变量,用于控制是启动一个新的SAP2000实例还是附…

【JVM】Java虚拟机调优 配置启动参数

一、配置方式 options - JVM启动参数。 配置多个参数的时候&#xff0c;参数之间使用空格分隔 参数命名&#xff1a; 常见为 -参数名 参数赋值&#xff1a; 常见为 -参数名参数值 | -参数名:参数值 二、内存参数 -Xms:初始堆大小&#xff0c;JVM启动的时候&#xff0c;给定…

C++:vector类

vector的介绍及使用 1. vector 是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c; vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的…

虾皮shopee根据ID取商品详情 API

公共参数 名称类型必须描述keyString是免费申请调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…