确保其他人可以 运行 我的 python 程序的可靠方法
Robust way to ensure other people can run my python program
我希望在 GitHub 上放置一个 python 程序,让其他人下载并 运行 它到他们装有各种操作系统的计算机上。我对 python 比较陌生,但已经足够使用它,以至于我注意到让所有包含的模块的各种版本一起工作可能会有问题。我刚刚发现 requirements.txt
的使用(使用 pipreqs
生成并使用命令 pip install -r /path/to/requirements.txt
部署),但很惊讶地注意到 requirements.txt
实际上没有说明 python 正在使用,所以显然它本身并不是完整的解决方案。所以我的问题是:需要哪一组 specifications/files/something-else 来确保下载我的项目的人实际上能够 运行 它而问题最少。
编辑: 我的计划是以获得最多赞成票的答案为指导。但到目前为止,在 4 个答案和 127 次浏览之后,没有一个答案有一个赞成票。如果某些答案不好,查看一些关于为什么它们不好的评论会很有用。
您是否考虑过设置 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 independent",则没有适合所有人的方法。这取决于您对代码执行的操作。需要研究您的特定代码如何与那些 OS 等
交互
到目前为止,我为此使用的最好的工具是 Pipenv。它不仅为您(开发人员)统一和简化了整个 pip+virtualenv 工作流程,而且还保证满足所有依赖项(包括 Python 本身)的 exact 版本其他人 运行 你的项目用它。
项目网站很好地解释了如何使用该工具,但为了完整起见,我将在此处进行简短说明。
一旦你安装了 Pipenv(例如,通过 运行ning 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/
每个人都可以运行它具有相同的环境。无需安装。
有很多很多很多方法可以做到这一点。我将详细介绍每个背后的原则,以及它的用例。
1。 python 环境
有很多方法可以做到这一点。 pipenv
、conda、requirments.txt
、等等等等
对于其中一些,您可以指定 python 版本。对于其他人,只需指定您知道它可以使用的 python 版本范围 - 例如,如果您使用的是 python 3.7,则不太可能不支持 3.6;只有一两个小的变化。 3.8 应该也可以。
另一个类似的方法是setup.py
。这些通常用于分发库 - 如 PyInstaller(我将在下面提到的另一种解决方案),或 numpy,或 wxPython,或 PyQt5 等 - 供 import/command 行使用。 python 打包指南非常有用,里面有很多教程。 (google python setup.py tutorial
)您还可以在这些文件中指定要求。
2。一个容器
Docker 是大的。如果你还没有听说过,我会感到惊讶。快速 google 的摘要得出 this,我将引用其中的一部分:
So why does everyone love containers and Docker? James Bottomley, formerly Parallels' CTO of server virtualization and a leading Linux kernel developer, explained VM hypervisors, such as Hyper-V, KVM, and Xen, all are "based on emulating virtual hardware. That means they're fat in terms of system requirements."
Containers, however, use shared operating systems. This means they are much more efficient than hypervisors in system resource terms. Instead of virtualizing hardware, containers rest on top of a single Linux instance. This means you can "leave behind the useless 99.9 percent VM junk, leaving you with a small, neat capsule containing your application,"
这应该为您总结一下。 (请注意,您不需要特定的 OS 容器。)
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.org and https://cx-freeze.readthedocs.io)
使用此分发方法时,您通常会在 GitHub 存储库中提供源代码、几个可供下载的 exe(每个平台一个)以及有关如何将代码构建为可执行文件的说明文件。
因为其他答案中没有,我想补充一个完全不同的方面:
单元测试。或一般测试。
通常,拥有一个已知的良好配置是件好事。根据程序的依赖关系,您可能必须测试不同的包组合。您可以使用例如自动方式执行此操作tox
或作为 CI/CD 管道的一部分。
没有关于应该测试什么包组合的一般规则,但通常 python2/3 兼容性是一个主要问题。如果您对具有主要版本差异的包有很强的依赖性,您可能需要考虑针对这些不同版本进行测试。
如果将所有 python 脚本转换为一个可执行文件可以帮助您,那么我下面的回答将有所帮助 ...
3 年来,我一直在 python 开发大型桌面应用程序。它是一个基于 GUI 的工具,建立在 pyqt 库之上(python-QT C++ 框架的绑定)。
我目前正在使用“py2exe”打包库:是一个 distutils 扩展,允许从 Python 构建独立的 Windows 可执行程序(32 位和 64 位)脚本;您所要做的就是:
安装py2exe:'pip install py2exe'
创建setup.py脚本:用于指定最终EXE的内容(名称、图标、作者、数据文件、共享库等..)
执行:pythonsetup.pypy2exe
我也在使用"Inno Setup"软件创建安装程序:创建快捷方式、设置环境变量、图标等...
当涉及到您可以选择的 python 包装(知识就是力量)时,我将简要总结一些现有的可用解决方案:
遵循 Structuring Your Project 提供的指导方针,这些约定被 python 社区广泛接受,这通常是新手在 python 开始编码的良好起点.通过遵循这些指南,python 在 github 或其他类似地方观看您的 project/source 的人将立即知道如何安装它。此外,将您的项目上传到 pypi 以及按照这些规则添加 CI 将是无痛的。
一旦您的项目根据标准约定正确构建,下一步可能是使用一些可用的 freezers,以防您想要交付给您的最终用户他们可以安装的软件包,而不必强迫他们在他们的机器上安装 python。请注意,虽然这些工具不会为您提供任何代码保护......否则,从最终工件中提取原始 python 代码在所有情况下都是微不足道的
如果您仍然想将您的项目发送给您的用户而不强迫他们安装任何开发依赖项,并且您也关心代码保护,所以您不想考虑任何现有的冻结器您可能会使用 nuitka, shedskin, cython 或类似工具。通常从这些工具生成的工件中逆向代码一点也不简单……另一方面,破解保护是另一回事,除非您不向最终用户提供物理二进制文件,否则您无能为力除了让他们慢下来之外,关于它:)
此外,如果您需要在 python 项目中使用外部语言,另一个想到的经典 link 是 https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages,添加按照 1 的规则 CI 构建此类工具的系统将非常容易。
也就是说,我建议坚持要点 1,因为我知道这足以让您入门,而且该特定要点应该涵盖 python 的许多现有用例"standard" 个项目。
虽然这并不是一份完整的指南,但通过遵循这些指南,您将能够立即向大众发布您的 python 项目。
我认为您可以将 docker 与 python https://github.com/celery/celery/tree/master/docker
一起使用
请关注这些文件,我认为您可以找到为 python 脚本制作 docker 文件的方法!
我希望在 GitHub 上放置一个 python 程序,让其他人下载并 运行 它到他们装有各种操作系统的计算机上。我对 python 比较陌生,但已经足够使用它,以至于我注意到让所有包含的模块的各种版本一起工作可能会有问题。我刚刚发现 requirements.txt
的使用(使用 pipreqs
生成并使用命令 pip install -r /path/to/requirements.txt
部署),但很惊讶地注意到 requirements.txt
实际上没有说明 python 正在使用,所以显然它本身并不是完整的解决方案。所以我的问题是:需要哪一组 specifications/files/something-else 来确保下载我的项目的人实际上能够 运行 它而问题最少。
编辑: 我的计划是以获得最多赞成票的答案为指导。但到目前为止,在 4 个答案和 127 次浏览之后,没有一个答案有一个赞成票。如果某些答案不好,查看一些关于为什么它们不好的评论会很有用。
您是否考虑过设置 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 independent",则没有适合所有人的方法。这取决于您对代码执行的操作。需要研究您的特定代码如何与那些 OS 等
交互到目前为止,我为此使用的最好的工具是 Pipenv。它不仅为您(开发人员)统一和简化了整个 pip+virtualenv 工作流程,而且还保证满足所有依赖项(包括 Python 本身)的 exact 版本其他人 运行 你的项目用它。
项目网站很好地解释了如何使用该工具,但为了完整起见,我将在此处进行简短说明。
一旦你安装了 Pipenv(例如,通过 运行ning 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/
每个人都可以运行它具有相同的环境。无需安装。
有很多很多很多方法可以做到这一点。我将详细介绍每个背后的原则,以及它的用例。
1。 python 环境
有很多方法可以做到这一点。 pipenv
、conda、requirments.txt
、等等等等
对于其中一些,您可以指定 python 版本。对于其他人,只需指定您知道它可以使用的 python 版本范围 - 例如,如果您使用的是 python 3.7,则不太可能不支持 3.6;只有一两个小的变化。 3.8 应该也可以。
另一个类似的方法是setup.py
。这些通常用于分发库 - 如 PyInstaller(我将在下面提到的另一种解决方案),或 numpy,或 wxPython,或 PyQt5 等 - 供 import/command 行使用。 python 打包指南非常有用,里面有很多教程。 (google python setup.py tutorial
)您还可以在这些文件中指定要求。
2。一个容器
Docker 是大的。如果你还没有听说过,我会感到惊讶。快速 google 的摘要得出 this,我将引用其中的一部分:
So why does everyone love containers and Docker? James Bottomley, formerly Parallels' CTO of server virtualization and a leading Linux kernel developer, explained VM hypervisors, such as Hyper-V, KVM, and Xen, all are "based on emulating virtual hardware. That means they're fat in terms of system requirements."
Containers, however, use shared operating systems. This means they are much more efficient than hypervisors in system resource terms. Instead of virtualizing hardware, containers rest on top of a single Linux instance. This means you can "leave behind the useless 99.9 percent VM junk, leaving you with a small, neat capsule containing your application,"
这应该为您总结一下。 (请注意,您不需要特定的 OS 容器。)
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.org and https://cx-freeze.readthedocs.io)
使用此分发方法时,您通常会在 GitHub 存储库中提供源代码、几个可供下载的 exe(每个平台一个)以及有关如何将代码构建为可执行文件的说明文件。
因为其他答案中没有,我想补充一个完全不同的方面:
单元测试。或一般测试。
通常,拥有一个已知的良好配置是件好事。根据程序的依赖关系,您可能必须测试不同的包组合。您可以使用例如自动方式执行此操作tox
或作为 CI/CD 管道的一部分。
没有关于应该测试什么包组合的一般规则,但通常 python2/3 兼容性是一个主要问题。如果您对具有主要版本差异的包有很强的依赖性,您可能需要考虑针对这些不同版本进行测试。
如果将所有 python 脚本转换为一个可执行文件可以帮助您,那么我下面的回答将有所帮助 ...
3 年来,我一直在 python 开发大型桌面应用程序。它是一个基于 GUI 的工具,建立在 pyqt 库之上(python-QT C++ 框架的绑定)。
我目前正在使用“py2exe”打包库:是一个 distutils 扩展,允许从 Python 构建独立的 Windows 可执行程序(32 位和 64 位)脚本;您所要做的就是:
安装py2exe:'pip install py2exe'
创建setup.py脚本:用于指定最终EXE的内容(名称、图标、作者、数据文件、共享库等..)
执行:pythonsetup.pypy2exe
我也在使用"Inno Setup"软件创建安装程序:创建快捷方式、设置环境变量、图标等...
当涉及到您可以选择的 python 包装(知识就是力量)时,我将简要总结一些现有的可用解决方案:
遵循 Structuring Your Project 提供的指导方针,这些约定被 python 社区广泛接受,这通常是新手在 python 开始编码的良好起点.通过遵循这些指南,python 在 github 或其他类似地方观看您的 project/source 的人将立即知道如何安装它。此外,将您的项目上传到 pypi 以及按照这些规则添加 CI 将是无痛的。
一旦您的项目根据标准约定正确构建,下一步可能是使用一些可用的 freezers,以防您想要交付给您的最终用户他们可以安装的软件包,而不必强迫他们在他们的机器上安装 python。请注意,虽然这些工具不会为您提供任何代码保护......否则,从最终工件中提取原始 python 代码在所有情况下都是微不足道的
如果您仍然想将您的项目发送给您的用户而不强迫他们安装任何开发依赖项,并且您也关心代码保护,所以您不想考虑任何现有的冻结器您可能会使用 nuitka, shedskin, cython 或类似工具。通常从这些工具生成的工件中逆向代码一点也不简单……另一方面,破解保护是另一回事,除非您不向最终用户提供物理二进制文件,否则您无能为力除了让他们慢下来之外,关于它:)
此外,如果您需要在 python 项目中使用外部语言,另一个想到的经典 link 是 https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages,添加按照 1 的规则 CI 构建此类工具的系统将非常容易。
也就是说,我建议坚持要点 1,因为我知道这足以让您入门,而且该特定要点应该涵盖 python 的许多现有用例"standard" 个项目。
虽然这并不是一份完整的指南,但通过遵循这些指南,您将能够立即向大众发布您的 python 项目。
我认为您可以将 docker 与 python https://github.com/celery/celery/tree/master/docker
一起使用请关注这些文件,我认为您可以找到为 python 脚本制作 docker 文件的方法!