草庐IT

python - 一个简单的Python部署问题-痛苦的世界

coder 2023-05-25 原文

我们有几个在Linux上运行的Python 2.6应用程序。其中一些是Pylons Web应用程序,其他一些只是长时间运行的进程,我们使用nohup从命令行运行。我们还在开发和生产中都使用virtualenv将这些应用程序部署到生产服务器的最佳方法是什么?

在开发中,我们只需将源树放入任何目录中,设置一个virtualenv并运行-足够容易。我们可以在生产中做同样的事情,也许这确实是最实用的解决方案,但是在生产中运行svn update感觉有点不对。我们还尝试了fab,但是它从来没有第一次起作用。对于每个应用程序,其他地方都会出错。令我惊讶的是,鉴于我们要实现的目标从根本上讲非常简单,整个过程都是太难了。这是我们从部署过程中想要的。

  • 我们应该能够运行一个简单的命令来部署应用程序的更新版本。 (如果初始部署涉及一些额外的复杂性就可以了。)
  • 当我们运行此命令时,应将某些文件(从Subversion存储库中或本地工作副本中)复制到服务器上的指定“环境”,这可能意味着不同的virtualenv。我们在同一服务器上同时拥有应用程序的生产版本和生产版本,因此需要以某种方式将它们分开。如果它安装到站点程序包中,也可以,只要它可以工作。
  • 我们在服务器上有一些配置文件应该保留(即,部署过程不会覆盖或删除)。
  • 这些应用程序中的某些应用程序从其他应用程序导入模块,因此它们需要能够以某种方式相互引用。这是我们最麻烦的部分!只要它在开发和生产中都能可靠地工作,我不在乎它是否可以通过相对进口,站点打包等方式工作。
  • 理想情况下,部署过程应自动安装应用程序依赖的外部软件包(例如psycopg2)。

  • 就是这样!它能有多难?

    最佳答案

    setuptools结合virtualenvpip使Python代码的开发和部署变得更加容易。

    核心思想

    我发现最棘手的部分是运行一个开发环境,该环境将尽可能紧密地反射(reflect)已部署的设置,同时尊重Pythonic工具和习惯用法。但是事实证明,使用pip和setuptools非常容易实现这一点,它们一起使您可以将开发树“安装”到Python环境中,而无需移动文件。 (实际上,setuptools本身可以完成所有操作,但是pip可以更好地充当前端处理依赖项。)

    另一个关键问题是使用两个环境中已知的软件包设置一个干净的环境。在这方面,Python的virtualenv是天赐之物,它允许您使用自己选择的软件包来配置完全定制的Python环境,而无需root访问权限或OS软件包(rpm或dpkg),并且不受任何软件包和版本的限制恰好安装在您的发行版上。

    最后,一个令人讨厌的错误负担是创建与PYTHON_PATH配合使用的命令行脚本的困难。 setuptools也非常优雅地处理了这一问题。

    配置

    (为简单起见,这是规定性的。请随时进行适当区分。)

  • 准备一个工作目录,您的Python东西可以将其命名为home。
  • this page的底部抓取最新的virtualenv并将其解压缩(无论在哪里)。
  • 从工作目录中,设置一个新的Python虚拟环境:
    $ python <untarred_directory>/virtualenv.py venv
    
  • 您将需要在此虚拟环境中完成大部分工作。使用此命令执行此操作(.source的快捷方式):
    $ . venv/bin/activate
    
  • 安装pip:
    $ easy_install pip
    
  • 为要创建的每个可安装软件包创建目录。
  • 在每个目录中,您将需要一个setup.py来定义软件包的内容和结构。 setuptools documentation是一个很好的入门资源。值得花时间吸收大量的时间。

  • 发展历程

    一旦树结构准备就绪,您几乎就可以开始编码了。但是现在,相互依赖的程序包无法像在已部署环境中那样相互看到。这个问题可以通过setuptools提供的一个巧妙的小技巧来解决,该技巧可以利用pip。对于您正在开发的每个程序包,运行以下命令(确保您位于项目的虚拟环境中,按照上面的步骤3):
    $ pip install -e pkg1
    

    该命令将pkg1安装到您的虚拟环境中,并且无需复制任何文件即可执行此操作。它仅向指向包的开发根目录的site-packages目录添加一个链接,并在该根目录中创建一个egg-info目录。您也可以不使用点子来执行此操作,如下所示:
    $ cd pkg1
    $ python setup.py develop
    

    它通常可以工作,但是如果您具有第三方依赖项(应该在setup.py中列出,如setuptools文档中here所述),则pip会更聪明地查找它们。

    需要注意的一个警告是,setuptools和pip都不擅长在您自己的程序包中查找依赖项。如果目录B中的PkgB依赖于目录A中的PkgA,则pip install -e B将失败,因为pip无法知道可以在目录A中找到PkgA。相反,它将尝试并失败从其在线存储库源下载PkgA。解决方法是简单地在每个软件包依赖之后安装它们。

    在这一点上,您可以启动python,加载您的模块之一并开始玩弄它。您可以编辑代码,下次导入时将立即可用。

    最后,如果要使用软件包创建命令行工具。不要用手书写。最后,您将遇到一堆糟糕透顶的PYTHON_PATH骇客,这些骇客永远无法正常运作。只需阅读setuptools文档中的automatic script creation。这将使您免于很多痛苦。

    部署方式

    准备好要执行的程序包时,可以使用setup.py创建部署程序包。这里有太多选择,但是以下几点可以帮助您入门:
    $ cd pkg1
    $ python setup.py --help
    $ python setup.py --help-commands
    

    末端松动

    由于问题的广泛性,此答案不一定是完整的。我没有处理长时间运行的服务器,Web框架或实际的部署过程(特别是使用pip install的--index-url管理第三方和内部软件包以及-e vcs+...的私有(private)存储库,这会将软件包从svn中拉出,git,hg或bzr)。但我希望我给了您足够的绳索来将它们绑在一起(只是不要将自己卡在身上:-)。

    关于python - 一个简单的Python部署问题-痛苦的世界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2741507/

    有关python - 一个简单的Python部署问题-痛苦的世界的更多相关文章

    1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

      我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

    3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

      尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

    4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

      使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

    5. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

      我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

    6. ruby-on-rails - 渲染另一个 Controller 的 View - 2

      我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

    7. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

      我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

    8. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

      如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

    9. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

      关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

    10. ruby - Fast-stemmer 安装问题 - 2

      由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

    随机推荐