如果最终用户没有所需的库怎么办?

Posted

技术标签:

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

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

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

正确的做法是什么?

【问题讨论】:

取决于你所说的“适当”。 相关:Best practice to install dependencies? 【参考方案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 Singh 在his 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】:

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

我知道的文件

requirements.txt:非常简单 setup.py:当您在 pypi https://***.com/a/1472014/8411228 等方面发布项目时使用 Pipfile:在 virtualenv 中工作时要走的路https://pipenv.kennethreitz.org/en/latest/ environment.yml:用于 Conda 环境 https://tdhopper.com/blog/my-python-environment-workflow-with-conda/#fn:requirements-conda

【讨论】:

【参考方案4】:

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

PyInstaller Quickstart

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

【讨论】:

【参考方案5】:

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

开发者

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

序言

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

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

传统方式

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

来源:您的代码 setup.py:指定元数据和创建 sdist 所需的依赖项。 requirements.txt:依赖列表

当代方式

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

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

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

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


用户

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

传统方式

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

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

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

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

当代方式

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

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

另见

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

【讨论】:

以上是关于如果最终用户没有所需的库怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

我保存记事本在C盘,为啥说:客户端没有所需的权限,怎么解决?

当最终用户正在安装所需的 .NET 运行时时,ClickOnce 应用程序发布失败

ELF 中的库符号和用户符号

堡垒主机连接到 rds 所需的忘记的密钥对

仅使用所需的库构建可执行文件?

CMake 在 Ubuntu 中找不到 GoogleTest 所需的库