如何根据需要从Python脚本自动安装所需的包?

问题描述 投票:0回答:6

Python 或 Linux 中是否有任何东西基本上指示系统“安装任何必要的东西”。基本上,我发现为我工作的每个新脚本/系统/服务器安装 python 包很烦人。无论如何,每次我最终都会做一个

sudo pip
apt-get
dnf
。为什么不在脚本本身内自动执行呢?无论何时出现“找不到包”错误,都将库名称传递给安装语句。有这个吗?

PS:我知道 docker 存在,但我是在 Python/脚本级别或纯粹的执行目的的直接系统级别进行讨论。

python linux ubuntu pip fedora
6个回答
101
投票

如何根据需要从Python脚本自动安装所需的包?

假设您的 Python 脚本是

example.py
:

import os
import time
import sys
import fnmatch
import requests
import urllib.request
from bs4 import BeautifulSoup
from multiprocessing.dummy import Pool as ThreadPool 
print('test')

您可以使用 pipreqs 根据 Python 脚本包含的

requirements.txt
语句自动生成
import
文件。要使用
pipreqs
,假设您位于
example.py
所在的目录中:

pip install pipreqs
pipreqs .

它将生成以下

requirements.txt
文件:

requests==2.23.0
beautifulsoup4==4.9.1

您可以安装:

pip install -r requirements.txt

24
投票

我知道的最好方法是,创建一个文件

requirements.txt
列出其中的所有包名称并使用pip

安装它
pip install -r requirements.txt

示例

requirements.txt

BeautifulSoup==3.2.0
Django==1.3
Fabric==1.2.0
Jinja2==2.5.5
PyYAML==3.09
Pygments==1.4
SQLAlchemy==0.7.1
South==0.7.3
amqplib==0.6.1
anyjson==0.3
...

3
投票

当您在新计算机上安装自定义项目时,您可以使用 setuptools 自动安装依赖项。如果您只想安装一些

PyPI
软件包,那么需求文件就可以正常工作。

这里是两者之间的一个很好的比较。从同一链接您可以看到,如果您的项目有两个依赖包

A
B
,则您只需在 setp.py 文件中包含一行

install_requires=[
   'A',
   'B'
] 

当然,

setuptools
可以做更多事情。您可以包含外部库(例如 C 文件)、非 PyPI 依赖项等的设置。文档 提供了有关安装依赖项的详细概述。还有一个关于 python 打包入门的非常好的tutorial

从他们的示例来看,典型的 setup.py 文件如下所示。

from setuptools import setup

setup(name='funniest',
      version='0.1',
      description='The funniest joke in the world',
      url='http://github.com/storborg/funniest',
      author='Flying Circus',
      author_email='[email protected]',
      license='MIT',
      packages=['funniest'],
      install_requires=[
          'markdown',
      ],
      zip_safe=False)

总之,上手就是这么简单

setuptools
。该软件包可以使您的代码迁移到新机器变得相当容易。


0
投票

pip3 安装 pipreqs

pip3 install -U --用户 pipreqs

mv requirements.txt  requirements.txt.orig
pipreqs --force ./

猫要求.txt

Keras==2.2.4 
scipy==1.3.0 
numba==0.44.1 
imgaug==0.2.9 
opencv_python==4.1.0.25

但是,某些模块需要二进制编译(您没有库),有些模块可以由系统包管理器以不同的名称安装。


0
投票

自动更新requirements.txt的方法

我不太确定自动安装需要什么,但是如果你停止使用requirements.txt,有3种方法:

  1. 开发完成后,当我们要部署它时,生成requirements.txt。它由
    pip freeze > requirements.txt
    pipreqs
    执行,以减少混乱的结果。
  2. 每次安装后手动将每个模块添加到requirements.txt。
  3. 安装将为我们处理requirements.txt更新的管理器。

stackoverflow上第一个选项有很多答案,2-d选项是不言自明的,所以我想描述一下3-d方法。有一个名为 to-requirements.txt 的库。要安装它,请输入以下内容:

pip install to-requirements.txt  # Pip install to requirements.txt

如果您立即阅读整个命令,您就会看到它的作用。安装后您应该对其进行设置。运行:

requirements-txt setup

它会覆盖 pip 脚本,以便每个

pip install
pip uninstall
都会使用所需版本的包自动更新项目的requirements.txt 文件。覆盖是安全进行的,因此卸载此软件包后,pip 将表现正常。

您可以定制它的工作方式。例如,全局禁用它并仅针对所需目录激活它,仅针对 git 存储库激活它,或者允许/禁止创建requirements.txt 文件(如果它不存在)。

友情链接:

  1. 文档 - https://requirements-txt.readthedocs.io/en/latest/
  2. GitHub - https://github.com/VoIlAlex/requirements-txt
  3. PyPI - https://pypi.org/project/to-requirements.txt/

0
投票

脚本中自动缺少 PyPI 软件包安装

这是我在 Python 脚本中使用的内容。它仅使用标准库来导入所有缺失的 PyPI 包。它也不需要任何额外的文本文件。

import pkg_resources, subprocess, sys

required  = {'PyQt5','PyQtWebEngine'}
installed = {pkg.key for pkg in pkg_resources.working_set}
missing   = required - installed

if missing:
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'pip'])
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', *missing])

倒数第二行是可选的。如有必要,它会升级

pip

© www.soinside.com 2019 - 2024. All rights reserved.