如何让Python中的指定函数仅在脚本首次运行时执行?
解决方案
现有代码的逻辑本身已经不会重复执行安装操作:import_and_install函数会先尝试导入模块,导入成功就不会走安装分支,你感知到的“每次触发执行”实际是每次都在执行模块导入检查。如果想要完全跳过整个依赖检查环节,仅首次运行时执行,可以通过添加本地标记文件的方式实现,以下是完整实现代码:
import importlib import subprocess import pkg_resources import os, time, json, datetime, sys # 标记文件路径,和脚本同目录 FLAG_FILE = ".deps_installed" def import_and_install(package): try: importlib.import_module(package) except (ModuleNotFoundError, pkg_resources.DistributionNotFound) as e: print("{0} module is not installed.\n Don't worry. will take care\n".format(package)) subprocess.check_call([sys.executable, '-m', 'pip', 'install', package]) # 仅当标记文件不存在时执行依赖安装流程 if not os.path.exists(FLAG_FILE): # 注意:threading是Python标准库,无需安装,已从列表移除 packages = ['pandas', 'numpy', 'xlwings'] for package in packages: import_and_install(package) # 全部安装完成后生成标记文件 with open(FLAG_FILE, 'w') as f: f.write("Dependencies installed successfully, skip check in next run") # 导入依赖 import pandas as pd import threading import xlwings as xw import numpy as np
逻辑说明
- 脚本启动后优先检查同目录下是否存在
.deps_installed标记文件,存在则直接跳过整个依赖检查安装环节 - 首次运行时标记文件不存在,会依次检查安装所有依赖,全部完成后自动生成标记文件
- 如果后续需要新增依赖项,只需删除同目录下的
.deps_installed文件,即可重新触发依赖检查安装流程
内容的提问来源于stack exchange,提问作者jyotirmay
相关产品推荐
相关产品推荐

