我们如何在Windows环境中构建和分发python脚本

时间:2017-02-03 14:35:07

标签: python python-3.x

我的团队正在享受使用python来解决我们业务的问题。我们编写了许多小型独立脚本应用程序。

但是,我们必须有一个中央窗口框,与传统应用程序一起运行它们。

我们的挑战是通过构建和部署过程。

我们希望让Bamboo从git中检查脚本,安装需求并运行测试,如果一切都是绿色,只需部署到我们的生产盒。

我们希望将库从脚本分离到脚本,这样我们就不会有依赖性问题。

我们试图让virtualenvs变得便携,但这似乎不行。

Pex看起来很有前途,但它在Windows上不起作用。

理想情况下,您会看到如下文件夹:

AppOne
  /Script.py
  /Libs
    /bar.egg
    /foo.egg
AppTwo
  /Script2.py
  /Libs
    /fnord.egg
    /fleebly.py

我们在想这个错吗?在企业中分发脚本的pythonic方法是什么?

5 个答案:

答案 0 :(得分:3)

<强> TL:DR:
使用Docker

短篇小说:

您可以使用docker为要部署的每个脚本创建独立映像。

您可以安装python imageslim是最轻的)作为每个脚本或一组脚本/应用程序的基础环境,并将其用作“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子目录中安装所有依赖项(您自己的和外部程序包)。这是一个相当强大的方法:

  1. 在其中创建顶级应用程序目录(AppOne)和Libs子目录。
  2. 使用pip install --ignore-installed --target=Libs package_name将依赖项安装到Libs子目录。
  3. 将您自己的软件包和模块复制到Libs子目录中(或使用pip将它们安装在那里)。
  4. 将Script.py复制到顶级目录。
  5. 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)
    
  6. 通过Libs\bar.eggLibs\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.pypython 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