【问题标题】:What if the end-user didn't have the required library?如果最终用户没有所需的库怎么办?
【发布时间】:2019-09-21 00:45:02
【问题描述】:

我的 Python 项目使用各种库。如果最终用户没有一个或任何一个,协议是什么?

是否应该弹出一个窗口并通知他/她在他/她的环境中下载哪个包和版本?或者我应该在我的项目中包含这些库?

正确的做法是什么?

【问题讨论】:

标签: python python-3.x


【解决方案1】:

在这里将 python 项目打包到模块中很方便modules 我们包含一个requirements.txt 文件,其中包含该python 库所需的所有python 模块要求,并在设置模块时自动安装它们。

Structuring your projectStructuring your project

【讨论】:

  • 仅仅一个requirements.txt 还不够吧?我认为您还需要__init__.pysetup.py 甚至更多。 docs.python-guide.org/writing/structure
  • 是的,问题是关于如何安装所需的库,这些库在requirements.txt 中列出,除此之外,我们还有你提到的这些东西!
【解决方案2】:

无论您的项目是什么,您都可以尝试将其制作成最终用户将安装的 python 包。它的工作方式是

在您的包的根目录中,您将包含一个setup.py。您可以在此文件中包含一个需求/依赖项列表(install_requires 键),当最终用户安装它时,它将与您的包一起安装。

然后最终用户可以使用 pip 来安装您的软件包,例如

pip install YourPackage

setup.py 中列出的所有依赖项都将首先安装。

此外,正如@Devesh Kumar Singhhis comment 中指出的那样,您还可以包含一个 requirements.txt 文件。然后用户可以使用这个文件安装

pip install -r requirements.txt YourPackage

this guide for building a python package, setuptools documentation

【讨论】:

  • 有趣。另外,我可以在 setup.py 中包含 os.system("pip install -r requirements.txt") 对吗?还是要求用户阅读的 requirements.txt?
  • @RSHAP 不,这会将环境与依赖项混为一谈
  • @RSHAP dstufft 关于此事:caremad.io/posts/2013/07/setup-vs-requirement
  • 是的,如果您将代码构建到一个包中并通过在其setup('requires'=[...]) 字段中提供所有依赖项来正确设置 setup.py,如果您尝试安装它们,它们将被自动获取包
  • @Kepler186 如果最终用户改用pip3?或者如果他们使用python -m pip 代替(因为pip 不在环境变量中)?您的操作系统方法存在许多缺陷。
【解决方案3】:

要向其他用户展示您的项目需要哪些库,您有多种选择。所有选项都是某种文件,说明该项目需要哪些库。

我知道的文件

【讨论】:

    【解决方案4】:

    另一种选择:您可以在 Windows、GNU/Linux、Mac OS X、FreeBSD、Solaris 和 AIX 下使用 PyInstaller 将 Python 应用程序冻结(打包)为独立的可执行文件。

    PyInstaller Quickstart

    这对我来说效果很好。确实,您不必担心最终用户是否安装了 Python。

    【讨论】:

      【解决方案5】:

      所以你做了一个包裹。现在你会想要分享它。接下来呢?

      开发者

      目标 - 制作一个分发(也称为“包”)以分享

      序言

      您现在打包您的并希望分发它。主要有两种包:

      • 一个应用程序部署一个源到服务器、github、网站,例如命令行界面
      • 发布源分布 (sdist) 或二进制文件(例如轮子)通常通过 twine 到 PyPI

      传统方式

      一个发行版中可能包含多个文件,但以下是主要文件:

      当代方式

      使用 pyproject.toml 指定在创建 sdist 或二进制文件时要使用的工具:

      创建+部署/发布包的现代工具包括:

      1. pipenv:制作一个包并替换requirements.txt(PyPA 推荐)
        • 开发:> pipenv install <dependency>> pipenv install
        • 发布:> pipenv -e . + twine
      2. poetry:制作一个包并发布到 PyPI
        • 开发> poetry add <dependency>, > poetry install
        • 发布:> poetry publish
      3. flit:制作一个包并发布到 PyPI
        • 开发:> flit install
        • 发布:> flit publish

      前两个选项具有创建干净的虚拟环境和使用锁定文件安全安装依赖项的功能。我会鼓励以后探索这些较新的选项,因为它们通过避免 setup.pysetuptools 解决了很多包装难题。


      用户

      目标 - 获取一个包并安装它的依赖项

      传统方式

      应用程序有多种部署方法,例如将您的应用上传到托管服务,例如heroku、DigitalOcean 等。用户可以通过网站、CLI 或其他方式间接与您的应用交互。

      库通常会上传到 PyPI。从这里用户通常可以使用pip 安装一个包,而与它们的制作方式无关:

      • > pip install <package>(推荐)
      • > pip install <packatge> -r requirements(显式,可选)

      这些命令行调用将从 PyPI 获取分发,安装包和指定的依赖项。

      当代方式

      这里有一些 pip 的替代方案:

      1. pipx:“安全地”在隔离环境中安装软件包
        • > pipx install <package>

      另见

      • Official docs PyPA 发布包
      • Tutorial 关于如何打包 Python 代码
      • Podcastpyproject.toml 和现代包装工具对 B. Cannon 的采访

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2020-09-04
        • 2019-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        相关资源
        最近更新 更多