我有几个python应用程序包含应该打包并部署为RPM的脚本/模块.
更棘手的是每个应用程序应该与所有python模块依赖项一起分发,并且这些应该优先于系统安装的任何应用程序使用.
其中一些RPM的目标主机具有有限的网络访问权限,因此RPM应包含运行应用程序所需的所有内容,而不是在部署时下载任何内容.
我已经看过包装和分发virtualenv,但重新定位virtualenv似乎并没有得到很好的支持.
我查看了zc.buildout,但发现文档缺乏.我可以看到如何在开发期间下载依赖项,而不是如何将它们作为更大的应用程序的一部分进行分发.不同的应用程序可能需要同一模块的不同版本,因此不应在系统范围内安装这些版本.
另一个痛点是应用程序中的任何python脚本都需要修改为在开发期间和部署后使用不同的sys.path,我无法看到明显的方法.
有关如何最好地实现这一点的建议吗?从开发人员的角度来看,工作流程的理想总结如下所示:
然后,最终的RPM应该可以在没有网络访问权限的主机上安装和运行,并且只安装了python解释器.
优点和缺点?
我个人正在为我的django项目使用buildout,但考虑到简单地切换到virtualenv + pip.
我一直在使用buildout很长一段时间没有任何问题,事实上我昨天没有任何问题.
但是今天我的所有项目都无法扩建.我尝试了两个不同的Ubuntu工作站,结果相同.
这是我得到的错误:
Initializing zc.buildout
Debug: Downloading http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg
Traceback (most recent call last):
File "bootstrap.py", line 259, in <module>
import zc.buildout.buildout
File "/tmp/tmpNkVMXW/zc.buildout-2.0.0-py2.7.egg/zc/buildout/buildout.py", line 18, in <module>
import zc.buildout.easy_install
File "/tmp/tmpNkVMXW/zc.buildout-2.0.0-py2.7.egg/zc/buildout/easy_install.py", line 59, in <module>
pkg_resources.Requirement.parse('distribute')
AttributeError: 'NoneType' object has no attribute 'location'
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 66, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
ImportError: No module named apport.fileutils
Original exception was:
Traceback (most recent call last):
File "bootstrap.py", line 259, in …Run Code Online (Sandbox Code Playgroud) 我正试图将项目从中移动virtualenv到buildout,但我不认为我已经掌握了整个概念buildout.我发现的所有教程都buildout在使用它的上下文中讨论Zope,我没有使用它,因此无法看到如何继续.
我的文件结构virtualenv如下:
myapp/
app.py
Run Code Online (Sandbox Code Playgroud)
哪个是运行使用/path/to/venvs/myapp/bin/python /path/to/myapp/script.py.
有了buildout,我的文件结构是:
myapp/
app.py
bootstrap.py
buildout.cfg
Run Code Online (Sandbox Code Playgroud)
运行python bootstrap.py并bin/buildout给我这些额外的文件:
myapp/
bin/
buildout
eggs/
setuptools-0.6c12dev_r80622-py2.6.egg
tornado-1.0.1-py2.6.egg
parts/
Run Code Online (Sandbox Code Playgroud)
在这一点上,我不确定如何"运行"我的应用程序.
建议吗?
在我的buildout.cfg文件中,我有这样的代码:
parts =
...
sphinxbuilder
Run Code Online (Sandbox Code Playgroud)
下一个在同一档案中:
eggs=
...
jinja2
markupsafe
sphinx
Run Code Online (Sandbox Code Playgroud)
然后,在文件的末尾:
[sphinxbuilder]
recipe = collective.recipe.sphinxbuilder
source = ${buildout:directory}/docs-src
build = ${buildout:directory}/docs
Run Code Online (Sandbox Code Playgroud)
我做:
bin/buildout
Run Code Online (Sandbox Code Playgroud)
它给出了输出(通常:OK):
Updating sphinxbuilder.
collective.recipe.sphinxbuilder: writing MAKEFILE..
collective.recipe.sphinxbuilder: writing BATCHFILE..
collective.recipe.sphinxbuilder: writing custom sphinx-builder script..
Run Code Online (Sandbox Code Playgroud)
在鸡蛋文件夹中我有Sphinxeeg.
之后buildout,在项目目录下我有一个新目录:docs.然后我运行命令:
bin/sphinx-quickstart
Run Code Online (Sandbox Code Playgroud)
就像root path for the documentation我设定的那样docs
然后我编辑docs/conf.py并取消注释
sys.path.insert(0, os.path.abspath('.'))
Run Code Online (Sandbox Code Playgroud)
我运行命令bin/sphinxbuilder并得到错误:
Makefile:12: *** The 'sphinx-build' command was not found.
Make sure you have Sphinx installed, then …Run Code Online (Sandbox Code Playgroud) 我已经看到了建扩建食谱监督员进入扩建,我想控制里面的守护进程.但是,在我看来,在/etc/init.d(例如)中仍然需要在启动时运行所述管理程序实例.
那么,为什么要在buildout中构建主管呢?为什么不在系统范围内安装它,只为内部涉及的守护进程创建一个配置文件?
Buildout不喜欢我的系统范围的Distribute安装并拒绝运行:
plone@s15447224:~/mybuildout$ python bootstrap.py
Creating directory '/home/plone/mybuildout/bin'.
Creating directory '/home/plone/mybuildout/parts'.
Creating directory '/home/plone/mybuildout/eggs'.
Creating directory '/home/plone/mybuildout/develop-eggs'.
Getting distribution for 'distribute==0.6.14'.
Before install bootstrap.
Scanning installed packages
Setuptools installation detected at /usr/lib/python2.6/dist-packages
Non-egg installation
Removing elements out of the way...
Already patched.
/usr/lib/python2.6/dist-packages/setuptools.egg-info already patched.
After install bootstrap.
Creating /usr/local/lib/python2.6/dist-packages/setuptools-0.6c11-py2.6.egg-info
error: /usr/local/lib/python2.6/dist-packages/setuptools-0.6c11-py2.6.egg-info: Permission denied
An error occurred when trying to install distribute 0.6.14. Look above this message for any errors that were output by easy_install.
While:
Bootstrapping.
Getting distribution for 'distribute==0.6.14'. …Run Code Online (Sandbox Code Playgroud) 如何在Plone产品中包含Buildout的配置信息?
我正在研究的plone产品之一是从文件系统读取和写入信息.它目前在egg命名空间内执行(例如在plone/product /目录中),但这对我来说并不合适.
我的想法是配置一个位置来存储可配置路径中的信息,就像iw.fss和iw.recipe.fss一样.
例如,将该信息保存到$ {buildout:directory}/var/mydata.
我有几个共享常见模块的python项目.到现在为止,我已经......咳嗽......保留公共代码的多个副本并手动同步.但我显然更愿意做别的事情.
它现在在我看来,好像zc.Buildout可能是我需要的.我想我应该做的是将我系统的每个可重用组件放入一个单独的egg中,然后使用buildout将它们组装到项目中.
我也在想,对于任何特定的模块,我应该将单元测试放入一个单独的包或蛋中,这样我就不会在每个项目中安装组件的单元测试副本.我只想在我的库开发的地方进行单元测试,而不是在刚刚使用的地方.
所以也许我想要这样的东西
projects
lib1
tests
code
lib2
tests
code
app1
tests
appcode
app2
tests
appcode
Run Code Online (Sandbox Code Playgroud)
等等
app1和app2都是独立的应用程序,有自己的代码和测试,但也包括和使用lib1和lib2.和lib1/test,lib1/code,lib2/test,lib2code,app1,app2是分开的鸡蛋.这听起来不错吗?
但是,我现在感到困惑.我假设当我开发app1时,我希望buildout将lib1,lib2和app1的副本放到一个单独的工作目录中,而不是直接将这些库的副本放在app1下.但是,这如何与我的SVN源代码控制一起使用?如果使用buildout动态构造工作目录,它不能是一个实时SVN目录,我可以从中检查更改回存储库?
我是否误解了如何使用buildout?我会更好地采用完全不同的方法吗?如何在项目之间混合源代码控制和模块重用?
更新:感谢两位目前已回答此问题的人.我正在尝试更多这个.
我正在努力学习Django.并且需要一些东西超越Hello world和Polls教程.你能否推荐任何用Django编写的真实项目?试图搜索,但发现并不多.特别感兴趣的是buildout的用法.
buildout ×10
python ×8
virtualenv ×3
django ×2
egg ×1
open-source ×1
packaging ×1
pip ×1
plone ×1
rpm ×1
supervisord ×1
svn ×1
zope ×1