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

2024-04-24 07:19:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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


Tags: 文件代码命令行用户pyapp应用程序可执行文件
2条回答

您可以按照评论中的建议使用pip。您需要在项目中创建一个MANIFEST.insetup.py以使其可安装。您还可以添加模块作为先决条件。更多信息可以在这个问题中找到(不是针对Django):

How do I package a python application to make it pip-installable?

这将使您的模块在Python中可用。然后,您可以让用户通过python path/run.py./path/run.py(具有+x权限)或{}(例如,对于别名)来运行模块。在

您甚至可以让用户从git公共存储库安装,如下所示

pip install git+https://bitbucket.org/yourname/projectname.git

……在这种情况下,他们也需要git。在

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

我非常喜欢Python的虚拟环境,因为它允许您将应用程序依赖性从操作系统的安装中分离出来。设想一个场景,您当前要分发的应用程序使用Python包requests v1.0。稍后,您将创建另一个要分发的应用程序,它使用requests v2.3。如果要同时安装这两个应用程序,则可能会导致版本冲突。虚拟环境解决了这个问题,因为每个应用程序都有自己的包位置。在

创建虚拟环境很容易。{{cd3}只需安装一次。现在,您的应用程序有了一个独立的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将如下所示:

^{pr2}$

现在,您可以将项目制作成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中创建一个符号链接,只需使用phone_home调用脚本:

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

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

这种方法只需稍加修改就可以很好地用于开发环境;即使用pip安装/引用您的开发目录:pip install -e .,其中.指的是当前目录,您应该在项目目录中与setup.py并排。在

希望这有帮助!在

相关问题 更多 >