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

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

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

whui0919 回答:确保他人可以运行我的python程序的可靠方法

您是否考虑过设置setup.py文件?这是将您所有...很好的设置捆绑到一个位置的便捷方法。因此,您的用户要做的就是A)复制您的存储库,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

此外,如果您要问如何使程序“与OS无关”,没有一种适合所有人的。这取决于您对代码的处理方式。需要研究您的特定代码如何与这些OS等交互。

,

有很多很多的方法可以做到这一点。我将介绍每种技术背后的原理,这是用例。

1。 python环境

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

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

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

2。容器

Docker是最重要的。如果您还没有听说,我会感到惊讶。 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文件(每个平台一个),以及有关如何将代码构建为可执行文件的说明。

,

到目前为止,我为此使用的最好的工具是Pipenv。它不仅为您(开发人员)统一并简化了整个pip + virtualenv工作流程,而且还确保当其他人使用它运行您的项目时,所有依赖项的 exact 版本(包括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没有任何关系,只是想分享这个很棒的工具。

,

如果您的程序较少涉及GUI或具有Web GUI,则可以使用Google Colaboratory共享代码。

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

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

,

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

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

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

  1. install py2exe:'pip install py2exe'

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

  3. 执行:python setup.py py2exe

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

,

我认为您可以将docker与python https://github.com/celery/celery/tree/master/docker一起使用

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

,

由于其他答案中都没有,我想添加一个完全不同的方面:

单元测试。或常规测试。

通常,拥有一个已知的好的配置很好。根据程序的依赖关系,您可能必须测试软件包的不同组合。您可以通过以下方式以自动化方式进行操作: tox或作为CI / CD管道的一部分。

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

,

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

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

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

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

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

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

虽然本指南并不旨在成为完整的指南,但您可以紧随其后地将python项目发布给大众。

本文链接:https://www.f2er.com/2552130.html

大家都在问