如何在没有进一步依赖的情况下以库为源来部署Python应用程序?

发布于 2021-01-29 15:26:20

背景
:我有一个小型的Python应用程序,它使开发人员在我们公司发布软件的生活变得更加轻松。我使用py2exe为Windows构建可执行文件。该应用程序以及二进制文件都被签入Subversion。人们只是从SVN中检出目录即可进行分发。该程序具有大约6种不同的Python库依赖关系(例如ElementTree,Mako)

情况 :开发人员想要破解该工具的源代码,然后在无需构建二进制文件的情况下运行它。当前,这意味着他们需要一个python
2.6解释器(很好),并且还使用easy_install在本地安装了6个库。

问题

  • 这不是公共的经典开放源代码环境:我在公司网络内部,该工具永远不会离开“围墙花园”,而且进入外部互联网时我们遇到了不便的障碍(NTLM认证代理和/或机器无需直接上网)。
  • 我希望最小化开始使用此工具的障碍:没有人应该在正确的版本中寻找正确的依赖项,他们应该执行尽可能少的设置。最好的前提条件是安装Python,然后从Subversion中检出程序。

轶事
:过程越独立,重复过程就越容易。我将我的机器换​​成一台新机器,然后经历了令人讨厌的过程,即必须对依赖项进行逆向工程,重新安装distutils,在线搜索库并进行安装(请参见上面的公司Internet限制)。

关注者
0
被浏览
41
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    由于@Boris指出的原因完全相同,我有时会使用下面描述的方法:我希望使用某些代码就像a)svn checkout / update-b)一样简单。

    但是为了记录:

    • 我大多数时候都使用virtualenv / easy_install。
    • 我在一定程度上同意@Ali A和@ S.Lott的批评

    无论如何,我使用的方法取决于修改sys.path,并且工作方式如下:

    • 在将要使用您的软件的所有计算机上都需要python和setuptools(以启用从卵中加载代码)。
    • 组织目录结构如下:

      项目/
      * .py
      scriptcustomize.py
      file.pth

      第三方/
          蛋/
              mako-vNNN.egg
              ... 。蛋
          码/
              elementtree \
                  * .py
              ...
      
    • 在您的顶级脚本中,在顶部包含以下代码:

      从脚本中定制导入apply_pth_files
      apply_pth_files( file

    • 将scriptcustomize.py添加到您的项目文件夹中:

      导入操作系统
      从glob导入glob
      导入文件输入
      导入系统

      def apply_pth_files(scriptfilename,at_beginning = False):
      “”“在脚本顶部:
      从脚本中定制导入apply_pth_files
      apply_pth_files( file

      “”
      目录= os.path.dirname(脚本文件名)
      文件= glob(os.path.join(目录,'* .pth'))
      如果没有文件:
          返回
      对于fileinput.input(files)中的行:
          行= line.strip()
          如果line和line [0]!='#':
              路径= os.path.join(目录,行)
              如果at_beginning:
                  sys.path.insert(0,路径)
              其他:
                  sys.path.append(路径)
      
    • 将一个或多个* .pth文件添加到您的项目文件夹中。在每一行上,对包含软件包的目录进行引用。例如:

      • .pth文件的#个内容
        第三方/代码
        第三方/鸡蛋/mako-vNNN.egg
    • 我喜欢这种方法。我喜欢的东西:它与* .pth文件的工作方式类似,但是适用于单个程序而不是整个站点程序包。我不喜欢的是:必须在顶级脚本的开头添加两行。

    • 再说一次:我大多数时候都使用virtualenv。但是我倾向于将Virtualenv用于对部署方案有严格控制的项目。在我没有严格控制的情况下,我倾向于使用上述方法。这使得将项目打包为zip并让最终用户(通过解压缩)“安装”它非常容易。


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看