【教程】自动检测和安装Python脚本依赖的第三方库

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]

背景说明

        对于新python环境,要运行某个脚本,可能需要安装很多库,一般可以通过提供的requirements.txt来自动安装。但如果没有这个txt,那就得手动一个一个安装,非常的麻烦。

        通过捕捉ImportError错误,实际上可以从错误消息中提取缺失的模块名称,而一旦确定了缺失的模块名称,就可以使用 pip 自动安装它们了。

参考脚本

autoDependencyInstaller.py

import argparse
import subprocess
import sys
import re

def install_module(module_name, python_executable):
    try:
        subprocess.check_call([python_executable, "-m", "pip", "install", module_name])
        return True
    except subprocess.CalledProcessError:
        return False

def extract_imports(file_name):
    with open(file_name, 'r') as file:
        file_content = file.read()
        imports = re.findall(r'^(?:from\s+(\S+)|import\s+(\S+))(?:\s+|$)', file_content, re.MULTILINE)
        top_level_modules = {imp[0].split('.')[0] if imp[0] else imp[1].split('.')[0] for imp in imports}
        return list(top_level_modules)

def check_module(module, python_executable):
    try:
        subprocess.check_call([python_executable, "-c", f"import {module}"])
        return True
    except subprocess.CalledProcessError:
        return False

def check_and_install_modules(modules, python_executable):
    for module in modules:
        if check_module(module, python_executable):
            print(f"模块 '{module}' 已存在.")
        else:
            print(f"尝试安装模块: {module}")
            if not install_module(module, python_executable):
                correct_name = input(f"安装 '{module}' 失败。请输入正确的包名,或按 Enter 跳过: ").strip()
                if correct_name:
                    install_module(correct_name, python_executable)

def main():
    parser = argparse.ArgumentParser(description="自动检测和安装 Python 脚本依赖.")
    parser.add_argument("script", help="要检查依赖的 Python 脚本文件名")
    parser.add_argument("-p", "--python-path", help="Python 解释器的路径(可选)", default=sys.executable)
    args = parser.parse_args()

    modules_to_check = extract_imports(args.script)
    check_and_install_modules(modules_to_check, args.python_path)

if __name__ == "__main__":
    main()

        参数第一项表示目标py文件。第二项表示要用道德python路径,如果没有给,则默认使用当前环境下的python

        这个脚本只提取 Python 脚本中的 importfrom ... import 语句,然后在当前脚本中尝试导入它们。这样做的好处是,不会执行原始脚本的其他部分,只会检查依赖项是否存在。如果遇到任何 ImportError,则可以安装相应的缺失模块。这种方法更加安全和高效,因为它避免了不必要的脚本执行。

使用示例

python autoDependencyInstaller.py <目标py文件> <目标python路径>

比如:

python autoDependencyInstaller.py young_http.py
python autoDependencyInstaller.py young_http.py -p /home/sxf/miniconda3/envs/py39/bin/python

进阶使用

        把这个脚本打包:

pip install pyinstaller
pyinstaller -F -w autoDependencyInstaller.py

        生成的二进制文件在dist目录下,所以就可以非常方便的使用了:

./dist/autoDependencyInstaller young_http.py -p /home/sxf/miniconda3/envs/py39/bin/python

注意:对于打包的文件,必须提供-p,不然用的是二进制文件自己的环境,会出问题。

        或者可以直接这样,用$(which python)

./dist/autoDependencyInstaller young_http.py -p $(which python)

更进阶使用

        把这个文件放到系统目录下,就不用每次都找了:

sudo mv dist/autoDependencyInstaller /usr/sbin/

        以后就可以直接用了:

autoDependencyInstaller young_http.py -p /home/sxf/miniconda3/envs/py39/bin/python

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这一年,熬过许多夜,也有些许收获 | 2023年终总结

大家好&#xff0c;我是小悟 时间如白驹过隙&#xff0c;一如流光匆匆&#xff0c;转瞬即逝。它如同沙漏中的细沙&#xff0c;无声无息地从指间溜走&#xff0c;留给我们无尽的思索。 我们总是无知地忙碌着&#xff0c;而忽略了时间无形的步伐&#xff0c;却发现它已经一去不…

8个plotly绘图技巧

文章目录 什么是Plotlyplolty绘图如何添加标题&#xff0c;及控制标题的颜色和大小&#xff1f;plotly绘图如何自定义x轴和y轴的名称饼图如何同时显示百分比和数值柱状图宽度如何添加注释如何绘制多子图如何添加图例以及控制其颜色、大小、位置等桑基图Python技术资源分享1、Py…

打开3d模型时显示不匹配怎么办---模大狮模型网

当3d模型打开时&#xff0c;显示不匹配的情况可能有以下几个原因和解决方法&#xff1a; 文件格式不匹配&#xff1a;检查您所使用的3D软件是否支持打开该模型文件格式。不同的软件支持不同的文件格式&#xff0c;如果文件格式不匹配&#xff0c;可能无法正确加载和显示模型。尝…

新能源汽车制造设备状态监测:无线温振传感器的应用

随着全球对环境保护的关注度不断增加&#xff0c;新能源汽车的市场需求正在逐步扩大。而为了满足这一需求&#xff0c;新能源汽车制造企业必须依赖高效、可靠的设备来进行生产制造。然而&#xff0c;设备状态的监测与维护对于保证生产线的稳定运行至关重要。无线温振传感器作为…

【JVM篇】Java是如何实现平台无关的?

Java是如何实现平台无关的? ✔️什么是平台无关性✔️平台无关性的实现✔️Java虚拟机✔️字节码✔️Java语言规范 ✔️扩展知识仓✔️平台无关性的好处✔️ 有哪些语言实现了平台无关?✔️Java中基本数据类型的大小都是确定的吗? ✔️什么是平台无关性 平台无关性就是一种语…

dds 问题记录

Q1. 2023.12.29 一个participant内部的数据也会放到topic中进行发布、订阅吗&#xff1f;为什么&#xff1f;如图中的topic3。 (from 车载通信架构 —— DDS协议介绍https://mp.weixin.qq.com/s/IasCCsVJ7w-CHeyXGM6soQ)

Java创建线程执行任务的方法(一)

目录 1.继承Thread类 2.实现Runnab类 2.1实现Runnable类 2.2使用Lambda表达式 3.实现Callable类 3.1返回Integer类型数据 3.2返回String类型数据 3.3返回Object类型数据 4.匿名内部类 创建线程的方法&#xff1a;继承Thread类&#xff1b;实现Runnab类&#xff1b;匿名…

深度解析高防产品---游戏盾

游戏盾是针对游戏行业所推出的高度可定制的网络安全解决方案&#xff0c;游戏盾是高防产品系列中针对游戏行业的安全解决方案。游戏盾专为游戏行业定制&#xff0c;针对性解决游戏行业中复杂的DDoS攻击、游戏CC攻击等问题。游戏盾通过分布式的抗D节点&#xff0c;可以防御TB级大…

归并算法:分治而治的高效算法大揭秘(图文详解)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《数据结构&算法》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 归并算法是我们算法中最常见的算法之一&#xff0c;其思想非常巧妙。本身归并是只能归并有序数组…

迁移Ubuntu报错问题

问题描述&#xff1a; 使用LxRunOffline-v3.5.0-mingw迁移Ubuntu至非系统盘时&#xff0c;出现如下报错 ‘Couldn’t set the case sensitive attribute of the directory “\?\C:\Users\xxx\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\Loc…

Typora使用PicGo+Gitee上传图片报错403 Forbidden

Typora使用PicGoGitee上传图片报错403 Forbidden Typora使用PicGoGitee上传图片&#xff0c;上传失败了&#xff0c;错误信息如下 打开PicGo的日志文件查看&#xff0c;可以看到错误详情如下 换了一个插件github-plus重新配置&#xff0c;解决了这个问题 再打开日志查看&…

ubuntu:beyond compare 4 This license key has been revoked 解决办法

https://www.cnblogs.com/zhibei/p/12095431.html 错误如图所示&#xff1a; 解决办法&#xff1a; &#xff08;1&#xff09;先用find命令找到bcompare所在位置&#xff1a;sudo find /home/ -name *bcompare &#xff08;2&#xff09;进入 /home/whf/.config,删除/bco…

计算机网络——应用层与网络安全(六)

前言&#xff1a; 前几章我们已经对TCP/IP协议的下四层已经有了一个简单的认识与了解&#xff0c;下面让我们对它的最顶层&#xff0c;应用层进行一个简单的学习与认识&#xff0c;由于计算机网络多样的连接形式、不均匀的终端分布&#xff0c;以及网络的开放性和互联性等特征&…

VerticalGridView适配触摸屏踩坑,触摸滑动时位置重置/闪烁问题

VerticalGridView是什么? VerticalGridView是安卓leanback库的列表组件,用于支持使用遥控器(按键事件)浏览列表。 它与RecyclerView的继承关系是:VerticalGridView→BaseGridView→RecyclerView 首先我想吐槽一下leanback的BaseGridView相关组件,耦合度较高,并且不允许开…

DOA估计算法——迭代自适应算法(IAA)

1 简介 迭代自适应法 (Iterative Adaptive Approach&#xff0c;IAA)估计算法最早由美国的电气工程师和数学家Robert Schmidt和Roy A. Kuc在1986年的一篇论文"Multiple Emitter Location and Signal Parameter Estimation"中首次提出了这一算法&#xff0c; IAA DOA …

[LitCTF 2023]作业管理系统

[LitCTF 2023]作业管理系统 信息搜集 进来发现要登录&#xff1a; 但是别着急&#xff0c;先查看源码或者抓个包&#xff1a; 可以看到源码中给出了提示&#xff1a;默认账户admin admin 。 账户名&#xff1a;admin&#xff0c;密码&#xff1a;admin&#xff0c;成功登录。…

腾讯云轻量应用服务器租用优惠价格表(多配置报价)

腾讯云轻量应用服务器优惠价格表&#xff0c;12月最新报价&#xff0c;腾讯云轻量2核2G3M带宽62元一年、2核2G4M轻量服务器118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元三年、4核8G12M轻量服务器646元15个月&#xff0c;CVM云服务器S5实例2核2G配置…

Gin 源码深度解析及实现

介绍 什么是 gin &#xff1f; 一个轻量级高性能 HTTP Web 框架。 Introduction | Gin Web Framework (gin-gonic.com) Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API&#xff0c;但性能比 Martini 快 40 倍。 为什么使用 gin &#xff1f; In…

基于CNN和双向gru的心跳分类系统

CNN and Bidirectional GRU-Based Heartbeat Sound Classification Architecture for Elderly People是发布在2023 MDPI Mathematics上的论文&#xff0c;提出了基于卷积神经网络和双向门控循环单元(CNN BiGRU)注意力的心跳声分类&#xff0c;论文不仅显示了模型还构建了完整的…

车联网的安全风险与应对措施

安全风险 1、恶意软件 攻击者可以通过入侵厂商或供应商网络&#xff0c;用恶意软件&#xff08;如病毒、木马、勒索软件等&#xff09;感染车联网系统组件&#xff0c;从而获得对车辆的控制权或窃取敏感信息。例如&#xff0c;一名安全研究人员成功入侵了特斯拉&#xff08;T…
最新文章