【问题标题】:How to automatically install required packages from a python script as necessary?如何根据需要从 python 脚本自动安装所需的包?
【发布时间】:2017-09-26 06:52:21
【问题描述】:

python 或 linux 中是否有任何东西基本上指示系统“安装任何必要的东西”。基本上,我发现为我工作的每个新脚本/系统/服务器安装 python 包很烦人。无论如何,每次我最终都会执行 sudo pip 或 apt-get 或 dnf 。为什么不在脚本本身内自动化呢。无论何时出现“未找到包”错误,将库名称传递给安装语句。有这个吗?

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

谢谢

【问题讨论】:

    标签: python linux ubuntu pip fedora


    【解决方案1】:

    如何根据需要从 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 脚本包含的 import 语句自动生成 requirements.txt 文件。使用pipreqs,假设你在example.py所在的目录:

    pip install pipreqs
    pipreqs .
    

    它将生成以下requirements.txt文件:

    requests==2.23.0
    beautifulsoup4==4.9.1
    

    您可以安装:

    pip install -r requirements.txt
    

    【讨论】:

      【解决方案2】:

      我知道的最好方法是,创建一个文件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
      ...
      

      【讨论】:

      • 包含一个setup.py 文件怎么样?setuptools.readthedocs.io/en/latest/setuptools.html
      • @Unni 你可以在答案中添加详细信息吗,我没有使用 setup.py
      • 是否可以将 setup.py 中包含的代码集成到目标脚本中,因此任何需要与大量必需库一起运行的复杂脚本,第一块代码(来自 setup .py) 将运行并处理所有这些问题。 @Unni
      【解决方案3】:

      当您在新机器上安装自定义项目时,您可以使用 setuptools 自动安装依赖项。如果您只想安装一些 PyPI 软件包,需求文件就可以正常工作。

      Here 是两者之间的一个很好的比较。从同一个链接您可以看到,如果您的项目有两个依赖包 AB,那么您只需在 setp.py 文件中包含一行

      install_requires=[
         'A',
         'B'
      ] 
      

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

      从他们的示例中,典型的 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='flyingcircus@example.com',
            license='MIT',
            packages=['funniest'],
            install_requires=[
                'markdown',
            ],
            zip_safe=False)
      

      总之,使用setuptools 非常简单。这个包可以很容易地将你的代码迁移到一台新机器上。

      【讨论】:

      • install_requires 只定义了所需的包,对吧?如果环境没有它们,它实际上不会安装它们。如果是这样,我们如何告诉包在安装我们的包时安装所有要求?
      • 运行python setup.py install时会安装包
      【解决方案4】:

      pip3 安装 pipreqs

      pip3 install -U --user 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
      

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

      【讨论】:

        【解决方案5】:

        自动更新 requirements.txt 方法

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

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

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

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

        如果您一次阅读整个命令,您会看到它的作用。安装后你应该设置它。运行:

        requirements-txt setup
        

        它会覆盖 pip 脚本,以便每个 pip installpip 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/

        【讨论】:

          猜你喜欢
          • 2019-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-14
          • 1970-01-01
          • 2012-12-22
          相关资源
          最近更新 更多