【发布时间】:2019-09-21 00:45:02
【问题描述】:
我的 Python 项目使用各种库。如果最终用户没有一个或任何一个,协议是什么?
是否应该弹出一个窗口并通知他/她在他/她的环境中下载哪个包和版本?或者我应该在我的项目中包含这些库?
正确的做法是什么?
【问题讨论】:
-
取决于你所说的“适当”。
标签: python python-3.x
我的 Python 项目使用各种库。如果最终用户没有一个或任何一个,协议是什么?
是否应该弹出一个窗口并通知他/她在他/她的环境中下载哪个包和版本?或者我应该在我的项目中包含这些库?
正确的做法是什么?
【问题讨论】:
标签: python python-3.x
在这里将 python 项目打包到模块中很方便modules
我们包含一个requirements.txt 文件,其中包含该python 库所需的所有python 模块要求,并在设置模块时自动安装它们。
【讨论】:
requirements.txt 还不够吧?我认为您还需要__init__.py、setup.py 甚至更多。 docs.python-guide.org/writing/structure
requirements.txt 中列出,除此之外,我们还有你提到的这些东西!
无论您的项目是什么,您都可以尝试将其制作成最终用户将安装的 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('requires'=[...]) 字段中提供所有依赖项来正确设置 setup.py,如果您尝试安装它们,它们将被自动获取包
pip3?或者如果他们使用python -m pip 代替(因为pip 不在环境变量中)?您的操作系统方法存在许多缺陷。
要向其他用户展示您的项目需要哪些库,您有多种选择。所有选项都是某种文件,说明该项目需要哪些库。
我知道的文件
【讨论】:
另一种选择:您可以在 Windows、GNU/Linux、Mac OS X、FreeBSD、Solaris 和 AIX 下使用 PyInstaller 将 Python 应用程序冻结(打包)为独立的可执行文件。
这对我来说效果很好。确实,您不必担心最终用户是否安装了 Python。
【讨论】:
所以你做了一个包裹。现在你会想要分享它。接下来呢?
开发者
目标 - 制作一个分发(也称为“包”)以分享
序言
您现在打包您的包并希望分发它。主要有两种包:
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.py 和 setuptools 解决了很多包装难题。
用户
目标 - 获取一个包并安装它的依赖项
传统方式
应用程序有多种部署方法,例如将您的应用上传到托管服务,例如heroku、DigitalOcean 等。用户可以通过网站、CLI 或其他方式间接与您的应用交互。
库通常会上传到 PyPI。从这里用户通常可以使用pip 安装一个包,而与它们的制作方式无关:
> pip install <package>(推荐)> pip install <packatge> -r requirements(显式,可选)这些命令行调用将从 PyPI 获取分发,安装包和指定的依赖项。
当代方式
这里有一些 pip 的替代方案:
pipx:“安全地”在隔离环境中安装软件包
> pipx install <package>另见
pyproject.toml 和现代包装工具对 B. Cannon 的采访【讨论】: