欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > python调用pip模块,使用pip_install脚本,在IDE中运行自动记录安装包到requirements文件的代码示例

python调用pip模块,使用pip_install脚本,在IDE中运行自动记录安装包到requirements文件的代码示例

2025/6/17 16:18:57 来源:https://blog.csdn.net/kiramario/article/details/148073214  浏览:    关键词:python调用pip模块,使用pip_install脚本,在IDE中运行自动记录安装包到requirements文件的代码示例

一个安装包会带出一片依赖,不建议一起捕获,因为有的包会按照平台给依赖,比如有的包在windows系统下会下载win32的包,有这个包的项目在linux上会报错。这也是使用pip list --format=freeze会出现的问题,它会列出当前操作系统,当前python环境的所有包。

示例1:使用Popen

import datetime  
import subprocess  
import pip, sys  
from pathlib import Path  
from typing import List  
from io import StringIO, TextIOBase  
from pyparsing import Word, nums,  Literal, Combinedef write_requirement(installed: str):  requirement_path = Path.cwd() / "requirements.txt"  if not requirement_path.exists():  with open(str(requirement_path), 'w') as f:  pass  with open(str(requirement_path), "a+") as f:  f.writelines(installed)  def parse_install_info(stdout_str: str, package_name: str):  dash = Literal("-")  version = Combine(Word(nums) + ("." + Word(nums)) * 2)  package_expr = Combine(Literal(package_name) + dash + version)  res = package_expr.searchString(stdout_str)  if len(res) == 0:  return ""  return res[0][0]  def run(package_name: str):  cmd_install = [sys.executable, "-m", "pip", "install", package_name]  p = subprocess.Popen(cmd_install,  stdout=subprocess.PIPE,  stderr=subprocess.STDOUT)  stdout, stderr = p.communicate()  if isinstance(stdout, bytes):  stdout = stdout.decode('utf-8')  installed = parse_install_info(stdout, package_name)  if not installed:  print("nothing write")  return  package_name_end_index = installed.index(package_name) + len(package_name)to_write = installed[0 : package_name_end_index] + "==" + installed[ package_name_end_index + 1:]  write_requirement(to_write)  if __name__ == "__main__":  run(package_name)

示例2:使用pip._internal模块的内置代码,不过这种不安全,不知道后期pip模块会不会有所修改,不让调用


# 写法1
def install(package):  buffer = StringIO()  sys.stdout = buffer  sys.stderr = sys.stdout  if hasattr(pip, 'main'):  pip.main(['install', package])  else:  pip._internal.main(['install', package])  output = buffer.getvalue()  parse_install_info(output)  # 还原标准输出  sys.stdout = sys.__stdout__  sys.stderr = sys.__stderr__  print("recover stdout, get content from buffer")  print(output)# 略: 和示例一后期处理一样# 写法2,只是将TextIOBase封装成class,另外一种风格而已
class CustomWriter(TextIOBase):  def __init__(self):  self.content = ""  def write(self, text):  self.content += textdef install2(package):  # 创建一个自定义的输出写入器  custom_writer = CustomWriter()  # 保存原来的标准输出  original_stdout = sys.stdout  # 重定向标准输出到自定义的写入器  sys.stdout = custom_writer  # 在这里执行需要输出的代码  print("Hello, World!")  print("This is a test.")  # 还原标准输出  sys.stdout = original_stdout  installed = parse_install_info(custom_writer.content, package_name)  # 略: 和示例一后期处理一样

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词