python 虚拟环境部署最佳实践
Best practice of python virtual environment deployment
很抱歉,如果这个问题在另一个 post 中得到了回答。
我对 python 和了解虚拟环境还很陌生。我知道我应该在虚拟环境中安装所有库并创建 requirement.txt,以便其他人可以使用它进行安装。但是,我不确定部署到生产环境的最佳实践是什么?
我问的原因是没有人应该可以访问生产环境,部署是通过预定义的管道进行的,我的理解是它会压缩我所有的代码并将其部署到生产环境,没有人认为投入生产做任何体力劳动。我可以尝试将管道获取到 运行 一个脚本,以安装基于 requirement.txt 的所有库,但我不确定防火墙设置是否相同。我是否也应该打包库?
还有,我该如何触发python脚本?我应该有一个包装脚本来在调用 python 脚本之前激活 vevn 并在之后停用它吗?或者有更简单的方法?
首先,虚拟环境有几个原因。主要原因是您可能有多个应用程序具有不同的 冲突 依赖项(即需要相同模块的不同版本)。第二个好处是它通过在您的虚拟环境中执行 pip freeze
命令巧妙地“枚举”您的应用程序所需的模块。无论您是否打算迁移到新环境,这都非常有用。
只要你的应用有如下shebang:
#!/full-path-to-the-bin-directory-of-my-virtual-environment/python3
那么您不必为您的脚本激活虚拟环境来查找环境的模块。无论如何,这是我使用 python -m venv
命令创建虚拟环境的经验。
因此,理想情况下,您可以 shell 访问您的生产环境,并能够在那里创建虚拟环境并使用使用 pip freeze
创建的 requirements.txt
文件对其进行初始化命令在您的开发虚拟环境中。因此,我不会将虚拟环境置于源代码控制之下,而是将 requirements.txt
文件置于源代码控制之下。
为了让您的程序在任何地方工作,无论是生产还是开发,它都需要所需的库。
通常所做的是,我们在服务器上创建一个新的虚拟环境(如 Booboo 所说的 'python -m venv <env_name>')并安装所有必需的包(pip install -r requirements.txt)('requirements.txt'应该在您的开发机器上使用 'pip freeze > requirements.txt')
创建
既然你说不允许任何人直接访问生产服务器,那肯定有一些步骤,你的系统管理员希望你遵循。在这种情况下,只有 he/she 可以帮助您。
至于防火墙,如果您的程序服务于某个端口,并且您的程序必须可以从本地主机以外的其他计算机访问,则必须打开该特定端口。这是您的服务器管理员应该为您做的事情。
在没有互联网的情况下在服务器上部署应用程序。考虑使用 PEX、Pants 构建系统进行部署。或者正如 Booboo 所说,您可以使用虚拟环境(不是真正的 pythonic 方式)部署和 运行 但它可以工作。对于我所在的用例,我们实际上是这样做的。
很抱歉,如果这个问题在另一个 post 中得到了回答。
我对 python 和了解虚拟环境还很陌生。我知道我应该在虚拟环境中安装所有库并创建 requirement.txt,以便其他人可以使用它进行安装。但是,我不确定部署到生产环境的最佳实践是什么?
我问的原因是没有人应该可以访问生产环境,部署是通过预定义的管道进行的,我的理解是它会压缩我所有的代码并将其部署到生产环境,没有人认为投入生产做任何体力劳动。我可以尝试将管道获取到 运行 一个脚本,以安装基于 requirement.txt 的所有库,但我不确定防火墙设置是否相同。我是否也应该打包库?
还有,我该如何触发python脚本?我应该有一个包装脚本来在调用 python 脚本之前激活 vevn 并在之后停用它吗?或者有更简单的方法?
首先,虚拟环境有几个原因。主要原因是您可能有多个应用程序具有不同的 冲突 依赖项(即需要相同模块的不同版本)。第二个好处是它通过在您的虚拟环境中执行 pip freeze
命令巧妙地“枚举”您的应用程序所需的模块。无论您是否打算迁移到新环境,这都非常有用。
只要你的应用有如下shebang:
#!/full-path-to-the-bin-directory-of-my-virtual-environment/python3
那么您不必为您的脚本激活虚拟环境来查找环境的模块。无论如何,这是我使用 python -m venv
命令创建虚拟环境的经验。
因此,理想情况下,您可以 shell 访问您的生产环境,并能够在那里创建虚拟环境并使用使用 pip freeze
创建的 requirements.txt
文件对其进行初始化命令在您的开发虚拟环境中。因此,我不会将虚拟环境置于源代码控制之下,而是将 requirements.txt
文件置于源代码控制之下。
为了让您的程序在任何地方工作,无论是生产还是开发,它都需要所需的库。 通常所做的是,我们在服务器上创建一个新的虚拟环境(如 Booboo 所说的 'python -m venv <env_name>')并安装所有必需的包(pip install -r requirements.txt)('requirements.txt'应该在您的开发机器上使用 'pip freeze > requirements.txt')
创建既然你说不允许任何人直接访问生产服务器,那肯定有一些步骤,你的系统管理员希望你遵循。在这种情况下,只有 he/she 可以帮助您。 至于防火墙,如果您的程序服务于某个端口,并且您的程序必须可以从本地主机以外的其他计算机访问,则必须打开该特定端口。这是您的服务器管理员应该为您做的事情。
在没有互联网的情况下在服务器上部署应用程序。考虑使用 PEX、Pants 构建系统进行部署。或者正如 Booboo 所说,您可以使用虚拟环境(不是真正的 pythonic 方式)部署和 运行 但它可以工作。对于我所在的用例,我们实际上是这样做的。