确保其他人可以运行我的python程序的可靠方法


17

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

编辑:我的计划是由投票最多的人为指导。但是到目前为止,在获得4个答案和127次查看后,没有一个答案甚至没有投票。如果某些答案不好,那么查看一些关于为什么不好的评论将很有用。


1
对于最少的问题,您是否考虑过Docker(或其他基于容器的解决方案)?docker.com
Zaccharie Ramzi

回复:Docker ...刚刚发现:“开发人员可以放心,该应用程序可以在任何其他Linux机器上运行”-但我希望它可以在任何OS上运行。(opensource.com/resources/what-docker
米克

通常,您支持所有经典操作系统:Windows(docs.docker.com/docker-for-windows)和mac(docs.docker.com/docker-for-windows
Zaccharie Ramzi

2
答案在很大程度上取决于上下文。是Python程序做的事情是sysos或子类型的功能或多个数学/分析?前者可以随Python的每个版本进行更改,而后者可以完全独立于版本。什么依赖库?numpy和pandas在各个平台上都做得非常出色,因此您只需检查一下是否有min版本即可。什么主要的Python版本?带有依赖库的Python 2.x和3.x之间的区别变得更加困难。如果您针对通用的主要发行版编写好的代码,那将是一个很好的开始。
dawg

2
正如无数答案所证明的那样,有很多方法可以解决此问题。我真的很好奇,如果答案会改变基于知道什么该应用程序。我想相信这没关系,但我怀疑这可能。我也认为这很大程度上取决于目标受众。精明的物理学博士运行机器学习应用程序,而Joe Internet则玩跳棋pygame。
Marcel Wilson

Answers:


15

您是否考虑过设置setup.py文件?这是将您所有...很好的设置捆绑到一个位置的便捷方法。因此,您的用户所需要做的就是A)复制您的仓库,B)运行pip install .以运行setup.py

关于此有很多堆栈讨论。

以及由请求人编写的句柄示例。

这应该涵盖大多数用例。现在,如果您要使其真正可分发,则需要考虑在官方发行中心PyPi中进行设置

除此之外,如果您要问如何使程序“独立于操作系统”,那么没有一种适合所有人的。这取决于您对代码的处理方式。需要研究您的特定代码如何与这些OS等交互。


7

有很多很多很多的方法可以做到这一点。我将讲解每一个背后的原理,这是用例。

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是最重要的。如果您还没有听说,我会感到惊讶。快速摘要的Google提出了this,我将引用其中的一部分:

那么,为什么每个人都喜欢容器和Docker?前Parallels服务器虚拟化CTO和领先的Linux内核开发人员James Bottomley解释说,VM Hypervisor(例如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 将不支持python2。从上一个主要版本(我认为是6.0)开始,cx_Freeze放弃了对python 2的支持。

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

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


1

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

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

安装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没有任何关系,只是想分享这个很棒的工具。



1

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

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

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

  1. 安装py2exe:'pip安装py2exe'

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

  3. 执行:python setup.py py2exe

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


py2exe多年来没有更新。我找不到任何近期活动。我认为那是不可维护的。(此外,它仅支持python <3.4。这意味着它仅支持不推荐使用的python版本)。
Legorooj


-1

因为其他答案中都没有,所以我想添加一个完全不同的方面:

单元测试。还是测试一般。

通常,拥有一个已知的良好配置是件好事。根据程序的依赖性,您可能必须测试软件包的不同组合。您可以tox使用CI / CD管道(例如)或将其作为CI / CD管道的一部分以自动化方式进行操作。

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


这是软件开发的一个非常重要的方面。但是,这完全无法回答问题。单元测试如何帮助分发程序?
Legorooj

恕我直言,OP并没有专门询问发行。他询问确保他人可以运行他的程序的方法。我认为单元测试实际上可以帮助实现这一目标,因为可能会限制人们使用一组可用的软件包。通常,分发问题很重要(并在此处得到了回答),但是我认为在现实世界中,我们不能仅依靠单个软件包创建整个venv,它至少需要与某些标准配置兼容。
Dschoni

我并不认为单元测试对于确保其正确运行很有价值,但是OP询问如何以“易于安装”的方式共享代码。这就是为什么我认为这是一个无效答案-对于这个特定问题。
Legorooj

我仍然认为问题不仅仅在于发行。这就是为什么我添加了这个答案。如果您在Windows上进行开发,则要确保在分发之前运行它,在Unix上进行测试是必不可少的。
Dschoni

出于好奇,与我刚才所说的有什么不同?... making sure it runs correctly ...?测试是确保它运行正常的重要组成部分,因此它是一个重要组成部分准备发行它,但它仍然没有任何与实际分配
Legorooj

-1

当您可以选择python封装时,我将为您简要概述一些现有的可用解决方案(知识就是力量):

  1. 遵循“ 构建项目”中提供的准则,这些约定已被python社区广泛接受,并且当新手开始使用python进行编码时,通常这是一个很好的起点。通过遵循这些准则,在github或其他类似地方观看您的项目/源代码的python专家将直接知道如何安装它。同样,将您的项目上传到pypi以及通过遵循这些规则添加CI也会很轻松。

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

  3. 如果您仍然希望将项目交付给用户而不强迫他们安装任何dev依赖项,并且您也很在意代码保护,那么您就不想使用任何现有的冻结器可以使用诸如nuitkashedskincython或类似的。通常,从这些工具产生的工件中逆转代码根本不是一件容易的事……另一方面,破解保护是另一回事,除非您不向最终用户提供物理二进制文件,否则您将无法做很多事情除了放慢速度之外,还可以:)

  4. 另外,如果您需要在python项目中使用外部语言,可以想到的另一个经典链接是https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages,通过以下操作将此类工具的构建系统添加到CI规则为1会很容易。

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

尽管不打算按照这些指南作为完整指南,但您可以立即将python项目发布给大众。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.