【问题标题】:Robust way to ensure other people can run my python program确保其他人可以运行我的 python 程序的可靠方法
【发布时间】:2020-07-10 17:09:11
【问题描述】:

我希望在 GitHub 上放置一个 python 程序,并让其他人下载并在具有各种操作系统的计算机上运行它。我对 python 比较陌生,但已经使用它足够注意到让所有包含的模块的各种版本一起工作可能会出现问题。我刚刚发现requirements.txt 的使用(使用pipreqs 生成并使用命令pip install -r /path/to/requirements.txt 部署)但很惊讶地注意到requirements.txt 实际上并没有说明正在使用什么版本的python,所以显然不是完整的解决方案。所以我的问题是:需要什么样的规范/文件/其他东西才能确保下载我的项目的人实际上能够以最少的问题运行它。

编辑:我的计划是以得到最多支持的答案为指导。但到目前为止,在 4 个答案和 127 次观看之后,没有一个答案甚至有一个赞成票。如果有些答案不好,那么看看一些 cmets 为什么他们不好。

【问题讨论】:

  • 为了尽可能减少问题,您是否考虑过 Docker(或其他基于容器的解决方案)? docker.com
  • Re: Docker... 刚刚发现:“开发人员可以放心,该应用程序可以在任何其他 Linux 机器上运行”——但我希望它可以在任何操作系统上运行。 (opensource.com/resources/what-docker)
  • 通常您支持所有经典操作系统:windows (docs.docker.com/docker-for-windows) 和 mac (docs.docker.com/docker-for-windows)
  • 这里的答案是高度上下文相关的。 Python 程序是否在做 sysos 或子进程类型函数或更数学/分析的事情?前者可以随 Python 的每个版本而改变,而后者可以完全独立于版本。有哪些依赖库? numpy 和 pandas 跨平台的工作非常出色,所以你可以检查你有一个最小版本。 Python 的主要版本是什么? Python 2.x 和 3.x 与依赖库之间的区别变得更加困难。如果您针对常见的主要版本编写好的代码,那是一个很好的开始。
  • 正如无数答案所证明的那样,有很多方法可以解决这个问题。我真的很好奇答案是否会因了解应用程序的什么而改变。我想相信这不重要,但我怀疑它可以。我也认为这在很大程度上取决于目标受众。精明的物理学博士运行机器学习应用程序与 Joe 互联网玩跳棋的 pygame。

标签: python requirements.txt


【解决方案1】:

我认为你可以在你的 python 中使用 docker https://github.com/celery/celery/tree/master/docker

请按照文件进行操作,我认为您可以找到为您的 python 脚本制作 docker 文件的方法!

【讨论】:

    【解决方案2】:

    当涉及到你可以选择的 python 打包时,我会给你一些现有的可用解决方案的非常简短的总结(知识就是力量):

    1. 遵循Structuring Your Project 提供的指导方针,这些约定被python 社区广泛接受,当新手开始使用python 编码时,这通常是一个很好的起点。通过遵循这些指南,pythonists 在 github 或其他类似地方观看您的项目/源代码将立即知道如何安装它。此外,按照这些规则将您的项目上传到 pypi 以及添加 CI 将很轻松。

    2. 一旦您的项目根据标准约定正确构建,下一步可能是使用一些可用的freezers,以防您想向最终用户提供他们可以在没有安装的情况下安装的包强迫他们在他们的机器上安装 python。请注意,尽管这些工具不会为您提供任何代码保护……否则,从最终工件中提取原始 python 代码在所有情况下都是微不足道的

    3. 1234563例如nuitkashedskincython 或类似的。通常,从这些工具生成的工件中逆向代码并非易事……另一方面,破解保护是另一回事,除非您不向最终用户提供物理二进制文件,否则您将无能为力除了减慢他们的速度之外:) 1234563很容易。

    也就是说,我建议坚持使用要点 1,因为我知道这足以让您入门,而且这一点应该涵盖 python“标准”项目的许多现有用例。

    虽然这不是一个完整的指南,但通过遵循这些指南,您将能够立即将您的 python 项目发布给大众。

    【讨论】:

      【解决方案3】:

      有很多很多很多很多很多方法可以做到这一点。我将介绍每个背后的原理,以及它的用例。

      1。一个python环境

      有很多方法可以做到这一点。 pipenv、conda、requirments.txt 等。

      使用其中的一些,您可以指定 python 版本。对于其他人,只需指定您知道可以使用的一系列 python 版本 - 例如,如果您使用的是 python 3.7,则不太可能不支持 3.6;只有一两个微小的变化。 3.8 应该也可以。

      另一个类似的方法是setup.py。这些通常用于分发库——比如 PyInstaller(我将在下面提到的另一个解决方案)、numpy、wxPython 或 PyQt5 等——用于导入/命令行使用。 python 打包指南非常有用,那里有很多教程。 (google python setup.py tutorial) 您还可以在这些文件中指定要求。

      2。一个容器

      Docker 是最大的。如果你还没有听说过,我会感到惊讶。一个快速的谷歌总结出现了this,我将引用其中的一部分:

      那么为什么每个人都喜欢容器和 Docker? James Bottomley 曾是 Parallels 的服务器虚拟化首席技术官和领先的 Linux 内核开发人员,他解释说 VM 管理程序,如 Hyper-V、KVM 和 Xen,都是“基于模拟虚拟硬件。这意味着它们在系统要求。”

      但是,容器使用共享操作系统。这意味着它们在系统资源方面比管理程序更有效。容器不是虚拟化硬件,而是位于单个 Linux 实例之上。这意味着您可以“留下 99.9% 的无用 VM 垃圾,为您留下一个包含应用程序的小巧整洁的胶囊”

      那应该为你总结一下。 (请注意,容器不需要特定的操作系统。)

      3。一个可执行文件

      在撰写本文时,有 2 个主要工具可以执行此操作。 PyInstaller 和 cx_Freeze。两者都在积极发展。两者都是开源的。

      您获取您的脚本,该工具将其编译为字节码,查找导入,复制它们,并创建一个可移植的 python 环境,在目标系统上运行您的脚本,而最终用户不需要 python。

      就个人而言,我更喜欢 PyInstaller - 我是开发人员之一。 PyInstaller 通过命令行脚本提供其所有功能,并支持您能想到的大多数库 - 并且可以扩展以支持更多。 cx_Freeze 需要安装脚本。

      这两种工具都支持 Windows、Linux、macOS 等。 PyInstaller 可以创建单个文件 exe,或一个文件夹包,而 cx_Freeze 仅支持一个文件夹包。 PyInstaller 3.6 支持 python 2.7 和 3.5-3.7 - 但 4.0 不会支持 python 2。cx_Freeze 已放弃对 python 2 的支持,截至上一个主要版本(我认为是 6.0)。

      无论如何,关于工具的功能已经足够了;你可以自己调查一下。 (请参阅https://pyinstaller.orghttps://cx-freeze.readthedocs.io 了解更多信息)

      使用这种分发方法时,您通常会在 GitHub 存储库中提供源代码、几个可供下载的 exe(每个平台一个)以及如何将代码构建为可执行文件的说明。

      【讨论】:

        【解决方案4】:

        如果将所有 python 脚本转换为一个可执行文件可以帮助你,那么我在下面的回答会有所帮助......

        3 年来,我一直在纯粹用 python 开发一个大型桌面应用程序。它是基于 pyqt 库(QT C++ 框架的 python-bindings)之上的基于 GUI 的工具。

        我目前正在使用“py2exe”打包库:是一个 distutils 扩展,允许从 Python 脚本构建独立的 Windows 可执行程序(32 位和 64 位);你所要做的就是:

        1. 安装 py2exe: 'pip install py2exe'

        2. 创建setup.py脚本:用于指定最终EXE的内容(名称、图标、作者、数据文件、共享库等..)

        3. 执行:python setup.py py2exe

        我也在使用"Inno Setup"软件创建安装程序:创建快捷方式、设置环境变量、图标等...

        【讨论】:

        • py2exe 多年未更新。我找不到任何最近的活动。我会假设,它是无人维护的。 (另外,它只支持python
        【解决方案5】:

        由于其他答案中缺少它,我想添加一个完全不同的方面:

        单元测试。或一般测试。

        通常,最好有一个已知的良好配置。根据程序的依赖关系,您可能需要测试不同的包组合。您可以使用自动方式执行此操作,例如tox 或作为 CI/CD 管道的一部分。

        对于应该测试什么包组合没有一般规则,但通常 python2/3 兼容性是一个主要问题。如果您对具有主要版本差异的软件包有很强的依赖关系,您可能需要考虑针对这些不同版本进行测试。

        【讨论】:

        • 这是软件开发的一个非常重要的方面。然而,这完全无法回答问题。单元测试如何帮助分发程序?
        • 恕我直言,OP 并没有专门询问分发。他询问如何确保其他人可以运行他的程序。我认为单元测试实际上可以帮助做到这一点,因为人们可能会被限制在可以使用的一组包中。一般来说,分发问题很重要(并且已经在这里得到了回答),但我认为在现实世界的场景中,我们不能仅仅依赖于为一个单独的包创建一个完整的 venv - 它至少需要与一些标准配置兼容。
        • 我并不认为单元测试对于确保它运行正确是有价值的,但是 OP 询问如何以“易于安装”的方式共享代码。这就是为什么我认为这是一个无效的答案 - 对于这个特定的问题。
        • 我仍然认为问题不仅仅在于分发。这就是我添加这个答案的原因。如果您在例如Windows,如果您想确保它在分发之前运行,在 Unix 上进行测试是必不可少的。
        • 出于好奇,和我刚才说的有什么不同? ... making sure it runs correctly ...?测试是确保它正确运行的重要部分,因此它是准备分发它的重要部分,但它仍然与实际分发它无关跨度>
        【解决方案6】:

        如果您的程序不太关注 GUI,或者有一个 Web GUI,那么您可以使用 Google Colaboratory 共享代码。

        https://colab.research.google.com/

        每个人都可以在相同的环境下运行它。无需安装。

        【讨论】:

          【解决方案7】:

          到目前为止我使用过的最好的工具是Pipenv。它不仅为您(开发人员)统一和简化了整个 pip+virtualenv 工作流程,而且还保证在其他人使用它运行您的项目时满足所有依赖项(包括 Python 本身)的 exact 版本.

          项目网站在解释如何使用该工具方面做得很好,但为了完整起见,我将在这里做一个简短的解释。

          一旦你安装了 Pipenv(例如,通过运行 pip install --user pipenv),你可以进入你的项目目录并运行 pipenv --python 3.7,这样 Pipenv 将为你的项目创建一个新的 virtualenv,创建一个 Pipfile 和一个Pipfile.lock(稍后会详细介绍)。如果你继续运行pipenv install -r requirements.txt,它将安装你所有的包。现在您可以执行pipenv shell 来激活您的新virtualenv,或者执行pipenv run your_main_file.py 来简单地运行您的项目。

          现在让我们看看你的 Pipfile 的内容。应该是这样的:

          [packages]
          Django = "*"
          djangorestframework = "*"
          iso8601 = "*"
          graypy = "*"
          whitenoise = "*"
          
          [requires]
          python_version = "3.7"
          

          该文件具有项目依赖项的可读规范(请注意,它也指定了 Python 版本)。如果你的 requirements.txt 有固定版本,你的 Pipfile 也可以有它们,但你可以安全地使用通配符,因为确切的版本存储在 Pipfile.lock 中。现在您可以运行 pipenv update 之类的东西来更新您的依赖项,并且不要忘记将 Pipfile 和 Pipfile.lock 提交到您的 VCS。

          一旦人们克隆了您的项目,他们所要做的就是运行pipenv install,而 Pipenv 会处理剩下的事情(它甚至可能为他们安装正确版本的 Python)。

          我希望这很有用。我与 Pipenv 没有任何关系,只是想分享这个很棒的工具。

          【讨论】:

            【解决方案8】:

            您是否考虑过设置setup.py 文件?这是将您的所有...井设置捆绑到一个位置的便捷方式。所以你的用户所要做的就是 A) 克隆你的 repo 和 B) 运行 pip install . 来运行 setup.py

            There's a great stack discussion about this.

            As well as a handle example written by the requests guy.

            这应该涵盖大多数用例。现在,如果您想让它真正可分发,那么您需要查看setting it up in PyPi,官方分发中心。

            除此之外,如果您要问如何使程序“独立于操作系统”,则没有一种万能的办法。这取决于您对代码执行的操作。需要研究您的特定代码如何与这些操作系统等交互。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-06-07
              • 1970-01-01
              • 2022-01-22
              • 2020-08-15
              • 2017-09-30
              • 2017-06-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多