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

news2024/11/26 20:41:23

转载请注明出处:小锋学长生活大爆炸[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.coloradmin.cn/o/1342686.html

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

相关文章

Live800:客服售前、售中,售后需要做哪些服务?有哪些区别?

客服在售前、售中和售后阶段扮演着重要的角色&#xff0c;他们为顾客提供全方位的服务&#xff0c;确保顾客的满意度和忠诚度。尽管这三个阶段都涉及到与顾客的互动&#xff0c;但每个阶段的服务内容和重点有所不同。 在售前阶段&#xff0c;客服的主要任务是提供产品或服务的信…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第三节 栈与堆&#xff0c;值类型与引用类型 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工…

视频监控EasyCVR如何通过设置sei接口,实现在webrtc视频流中添加画框和文字?

安防视频监控系统基于视频综合管理平台EasyCVR视频系统&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;具备权限管…

炎症状态重塑了急性髓系白血病的免疫微环境并改善了风险分层

今天给同学们分享一篇实验文章“An inflammatory state remodels the immune microenvironment and improves risk stratification in acute myeloid leukemia”&#xff0c;这篇文章发表在Nat Cancer期刊上&#xff0c;影响因子为22.7。 结果解读&#xff1a; 成人和儿童AML的…

掌握比特币生态话语权,或将成为下一轮牛市爆发的掌舵人!

伴随着美国SEC批准比特币现货的强烈的市场预期&#xff0c;比特币财富效应日益显著&#xff0c;比特币价格更是从年初的16500美金一路上涨到了44000美金&#xff0c;而代币上涨带来的大量资金的涌入&#xff0c;也促使比特币生态也再次进入了高速发展期&#xff0c;铭文资产在比…

**Python**综合案例

Python综合案例 一、系统需求分析 1、需求分析 使用面向对象编程思想完成学员管理系统的开发,具体如下: ① 系统要求:学员数据存储在文件中 ② 系统功能:添加学员、删除学员、修改学员信息、查询学员信息、显示所有学员信息、保存学员信息及退出系统等功能。 2、角色…

C/C++ 函数参数按引用传递、指针传递、实参传递

引用经常被用作函数参数&#xff0c;使得函数中的变量名成为调用程序中的变量的别名。这种传递参数的方法称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。C新增的这项特性是对 C语言的超越&#xff0c;C语言只能按值传递。按值传递导致被调用函数使用调…

【JS 逆向百例】steam 登录 Protobuf 协议详解

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

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;匿名…

java使用JSON工具解析字符串、数组详解

一&#xff1a;问题 1.最近自己在前后端数据交互时需要进行JSON格式字符串、数组数据进行转换&#xff0c;进行问题整理 2.遇到需要JSON字符串转换的朋友可以阅读 二&#xff1a;解析步骤 1.第一点首先确定需求&#xff0c;明确需要转的字符串是一个对象还是一个数组&#…

腾讯云服务器怎么购买?流程来了

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…

lag-llama源码解读(Lag-Llama: Towards Foundation Models for Time Series Forecasting)

Lag-Llama: Towards Foundation Models for Time Series Forecasting 文章内容&#xff1a; 时间序列预测任务&#xff0c;单变量预测单变量&#xff0c;基于Llama大模型&#xff0c;在zero-shot场景下模型表现优异。创新点&#xff0c;引入滞后特征作为协变量来进行预测。 获得…

【每天一个早下班技巧】NPM发包流程

发包流程 step1&#xff1a;设置包发布地址 参考资料 // 1.在package.json中设置发布地址 "publishConfig":{"registry":"http://registry.npm.xxx.com" }//2.设置别名 alias ynpm"npm --registryhttp://registry.npm.xxx.com" ynp…

Typora使用PicGo+Gitee上传图片

Typora使用PicGoGitee上传图片 1.下载PicGo(国内镜像) https://mirrors.sdu.edu.cn/github-release/Molunerfinn_PicGo/ 点击PicGo-Setup-2.3.0-x64.exe &#xff08;64位安装&#xff09; 然后打开gitee&#xff08;没注册先注册&#xff09; 2.下载node.js插件 https:/…

电脑系统坏了用U盘重装系统教程

我们平时办公、学习都会用到电脑&#xff0c;如果电脑系统坏了&#xff0c;就会影响自己正常使用电脑&#xff0c;这时候就可以通过U盘来重装一个正常的操作系统。如果您不知道具体的重装操作步骤&#xff0c;那么可以参考下面小编分享的利用U盘快速完成操作系统重装的步骤介绍…

4.14 构建onnx结构模型-Min

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Min 结点进行分析 方式 方法一&…

【网络安全 | XCTF】2017_Dating_in_Singapore

正文 题目描述&#xff1a; 01081522291516170310172431-050607132027262728-0102030209162330-02091623020310090910172423-02010814222930-0605041118252627-0203040310172431-0102030108152229151617-04050604111825181920-0108152229303124171003-261912052028211407-0405…

华为无线AC内三层漫游配置详解

重要说明 1、在一台ac中实现三层漫游 2、ac和核心的互联vlan和ap的管理vlan是同一个广播域&#xff0c;可以不用配option 43 3、直接转发模式&#xff0c;ac上可以不起业务vlan&#xff0c;ac和核心交换机上可以只放行一个互联vlan 10 4、ac上要启两个vap魔板&#xff0c;两个…

Git 浅入浅出

前提 最近和同事分模块联合开发代码&#xff0c;自然而然就要用到 Git 管理代码&#xff1b;借此机会&#xff0c;对 Git 进行简单介绍。 Git 的特征 文件系统 我们都知道 Git 是个版本控制系统&#xff0c;但是如果你深入了解其原理&#xff0c;就不难发现它更像一个文件管…

区间DP详解,思路分析,OJ详解

文章目录 前言问题引入暴力枚举自下而上状态设计状态转移方程 区间DP的分析状态设计状态转移时间复杂度翻译成递推 OJ详解P1880 [NOI1995] 石子合并记忆化搜索版本递推版本 HDU Dire WolfMultiplication PuzzlePolygon 总结 前言 区间dp属于动态规划中一类比较好理解的问题&…