我的团队正在享受使用python来解决我们业务的问题。我们编写了许多小型独立脚本应用程序。
但是,我们必须有一个中央窗口框,与传统应用程序一起运行它们。
我们的挑战是通过构建和部署过程。
我们希望让Bamboo从git中检查脚本,安装需求并运行测试,如果一切都是绿色,只需部署到我们的生产盒。
我们希望将库从脚本分离到脚本,这样我们就不会有依赖性问题。
我们试图让virtualenvs变得便携,但这似乎不行。
Pex看起来很有前途,但它在Windows上不起作用。
理想情况下,您会看到如下文件夹:
AppOne
/Script.py
/Libs
/bar.egg
/foo.egg
AppTwo
/Script2.py
/Libs
/fnord.egg
/fleebly.py
我们在想这个错吗?在企业中分发脚本的pythonic方法是什么?
答案 0 :(得分:3)
<强> TL:DR:强>
使用Docker
短篇小说:
您可以使用docker为要部署的每个脚本创建独立映像。
您可以安装python image(slim
是最轻的)作为每个脚本或一组脚本/应用程序的基础环境,并将其用作“virtualenv”,您可以在其中安装所有脚本你对该脚本的依赖。
还有Bamboo and Docker的集成,您可能会发现它很有用。
以下是Docker documentation供参考。
您可以在单独的容器中单独测试每个脚本,如果它通过,那么您可以使用相同的容器将其部署到主服务器中。
这不完全是您所要求的,但您可以在每个平台(Windows,Linux等)中使用此解决方案,您可以将所有脚本部署到企业服务器(或任何地方)并使用它们整个公司。
<小时/> 免责声明:这不是解决方案,我知道哪个解决方案适用于此答案的时间(2017)
答案 1 :(得分:3)
如果相对未知的feature sneaked into Python 2.6没有太多麻烦,你可以做到这一点:将zip文件作为Python应用程序执行。在PEP 441(这是PEX受到启发)之后,它得到了一些(仅仅是一点点)宣传,尽管我认为大多数人仍然没有意识到这一点。我们的想法是您创建一个zip文件(推荐的扩展名为.pyz
或.pyzw
用于窗口化应用程序,但这显然不重要)包含您想要的所有代码和模块,然后你只需用Python运行它。解释器会将zip文件的内容添加到sys.path
,并查找名为__main__
的顶级模块并运行它。 Python 3.5甚至引入了便利模块zipapp
来创建这样的打包应用程序,但它确实没有任何魔力,您也可以手动或脚本创建它。
在您的情况下,我猜Bamboo可以在virtualenvs中执行检出,依赖安装和测试,然后将应用程序与环境库一起打包。它不是一键式解决方案,但它可以在没有其他工具的情况下完成。
答案 2 :(得分:1)
另一种可能性是pyinstaller。它创建了可以部署的可执行文件。甚至不需要在已部署的生产盒上安装Python。调试仅在已部署的框上发生的问题更难。您也无法修改已部署的框中的脚本,这取决于您对计算机所有者的信任是积极的还是消极的。见http://www.pyinstaller.org/
答案 3 :(得分:1)
据我了解,您希望在构建服务器上创建自包含的应用程序目录,然后将它们复制到生产服务器并直接从它们运行脚本。特别是,您希望在每个应用程序目录的Libs
子目录中安装所有依赖项(您自己的和外部程序包)。这是一个相当强大的方法:
AppOne
)和Libs
子目录。pip install --ignore-installed --target=Libs package_name
将依赖项安装到Libs
子目录。Libs
子目录中(或使用pip将它们安装在那里)。在Script.py
顶部添加代码,将Libs
目录添加到sys.path
:
import os, sys
app_path = os.path.dirname(__file__)
lib_path = os.path.abspath(os.path.join(app_path, 'Libs'))
sys.path.insert(0, lib_path)
通过Libs\bar.egg
或Libs\fleebly.py
,您的脚本可以使用import bar
等软件包和import fleebly
等模块。如果没有这样的代码,您的脚本就无法找到这些包和模块。
如果您想简化脚本的这一部分,可以选择以下几种方法:(1)将这些行放在顶级目录中的单独fix_path.py
模块中,然后调用import fix_path
在脚本的开头。 (2)使用行Libs\__init__.py
创建sys.path.insert(0, os.path.dirname(__file__))
文件,然后从脚本中调用import Libs
。之后,Libs\x
可以通过import x
导入。这很简洁,但它是对包和路径机制的非标准使用(它使用Libs
作为库目录和包),因此它可能会对导入的工作方式产生一些混淆。
一旦这些目录和文件到位,您可以将整个结构复制到安装了Python的任何Windows系统,然后使用cd AppOne; python Script.py
或python AppOne\Script.py
运行它。如果您将顶级脚本命名为__main__.py
而不是Script.py
,则只需执行python AppOne
即可运行您的应用。
此外,正如@jdehesa指出的那样,如果您的脚本名为__main__.py
,则可以将AppOne
目录(但不是AppOne
目录本身)的内容压缩到文件中调用AppOne.zip
,然后将其复制到生产服务器并通过调用python AppOne.zip
运行它。 (在Python 3.5或更高版本中,如果您的脚本被调用python -m zipapp AppOne
,您也可以通过__main__.py
创建zip文件。如果您的脚本被调用,您也可以使用python -m zipapp AppOne -m Script
{{ 1}}。见https://docs.python.org/3/library/zipapp.html。)
答案 4 :(得分:0)
这种事情可以很容易地处理python setup.py
示例setup.py
from setuptools import setup
setup(
name=name_for_distribution,
version=version_number,
py_modules=[pythonfiles],
install_requires=[
python packages that need to be installed
]
)
创建虚拟环境,激活它并运行: python setup.py install
我觉得这是分发和打包项目的最pythonic方式。
阅读链接:
https://pythonhosted.org/an_example_pypi_project/setuptools.html https://docs.python.org/2/distutils/setupscript.html