gpt4 book ai didi

python - 打包命令行应用程序进行分发?

转载 作者:太空狗 更新时间:2023-10-29 21:29:03 25 4
gpt4 key购买 nike

我目前正在用 Python 编写一个命令行应用程序,它需要以易于下载和运行的方式提供给最终用户。对于那些在 Windows 上可能没有安装 Python (2.7) 的用户,我打算使用 PyInstaller生成独立的 Windows 可执行文件。然后用户将能够简单地下载“myapp.exe”并运行 myapp.exe [ARGUMENTS]

我还想为已经安装了 Python 的用户(在各种平台上)提供一个(较小的)下载。一种选择是将我的所有代码放入单个 .py 文件“myapp.py”(以 #!/usr/bin/env python 开头),并使其可用。这可以下载,然后使用 myapp.py [ARGUMENTS]python myapp.py [ARGUMENTS] 运行。但是,将我的应用程序限制为单个 .py 文件有几个缺点,包括限制我组织代码的能力以及难以使用第三方依赖项。

相反,我想分发我自己代码的几个文件的内容,以及一些(纯 Python)依赖项。是否有任何工具可以将所有这些打包到一个文件中,该文件可以轻松下载并使用现有的 Python 安装运行?

编辑:请注意,我需要这些应用程序易于最终用户运行。他们不太可能安装了 pip,也没有安装 Python 核心之外的任何其他东西。使用 PyInstaller,我可以生成一个文件,这些用户可以从 Web 下载该文件并使用一个命令运行(或者,如果没有参数,只需双击即可)。有没有一种方法可以在不使用 PyInstaller(即不冗余捆绑 Python 运行时)的情况下实现这种易用性?

最佳答案

我不喜欢单一文件的想法,因为它会成为维护负担。我会探索类似下面的方法。

我已经成为 Python 虚拟环境的忠实粉丝,因为它允许您将应用程序依赖项从操作系统的安装中分离出来。想象这样一个场景,您当前要分发的应用程序使用 Python 包 requests v1.0。一段时间后,您创建了另一个要分发的应用程序,它使用 requests v2.3。您最终可能会在要同时安装两个应用程序的系统上遇到版本冲突。虚拟环境解决了这个问题,因为每个应用程序都有自己的包位置。

创建虚拟环境很容易。一旦安装了 virtualenv,只需运行即可,例如 virtualenv/opt/application/env。现在您的应用程序有了一个独立的 Python 环境。此外,虚拟环境非常容易清理,只需删除 env 目录即可。

您需要一个 setup.py 文件来将您的应用程序安装到环境中。假设您的应用程序使用 requests v2.3.0,您的自定义代码位于名为 acme 的包中,您的脚本名为 phone_home。您的目录结构如下所示:

acme/
__init__.py
models.py
actions.py
scripts/
phone_home
setup.py

setup.py 看起来像这样:

from distutils.core import setup


install_requires = [
'requests==2.3.0',
]

setup(name='phone_home',
version='0.0.1',
description='Sample application to phone home',
author='John Doe',
author_email='john@doe.com',
packages=['acme'],
scripts=['scripts/phone_home'],
url='http://acme.com/phone_home',
install_requires=install_requires,
)

您现在可以从您的项目中制作一个 tarball 并按照您的意愿托管它(您自己的 Web 服务器、S3 等):

tar cvzf phone_home-0.0.1.tar.gz .

最后,您可以使用 pip 将您的包安装到您创建的虚拟环境中:

/opt/application/env/bin/pip install http://acme.com/phone_home-0.0.1.tar.gz

然后您可以运行 phone_home:

/opt/application/env/bin/phone_home

或者在/usr/local/bin 中创建一个符号链接(symbolic link)以简单地使用 phone_home 调用脚本:

ln -s /opt/application/env/bin/phone_home /usr/local/bin/phone_home

上述所有步骤都可以放在一个 shell 脚本中,这将使该过程成为单命令安装。

稍作修改后,这种方法非常适合开发环境;即使用 pip 安装/引用您的开发目录:pip install -e . 其中 . 指的是当前目录,您应该与 setup 一起位于项目目录中.py.

希望这对您有所帮助!

关于python - 打包命令行应用程序进行分发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24143422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com