作为rpm安装过程的一部分运行Python脚本

时间:2011-10-19 18:57:42

标签: python django rpm rpmbuild

从rpm安装内部运行Python脚本时,我应该注意哪些问题?

这是问题的要点。我们创建了一个自定义RPM安装程序来部署我们的Django应用程序。作为安装过程的一部分,我想运行一个Django管理命令,该命令收集所有静态文件并将它们复制到预定义的位置。以下是从命令行手动运行时的样子:

$ python2.6 manage.py collectstatic --noinput
/usr/lib/python2.6/site-packages/reversion/__init__.py:31: UserWarning: django-reversion 1.5 is intended for use with django 1.3.0. You are running django 1.3.1, so some features, such as admin integration, may not work. Please see https://github.com/etianen/django-reversion/wiki/Compatible-Django-Versions
  "django_version": format_version(django.VERSION[:3]),
Copying '/usr/lib/python2.6/site-packages/django/contrib/admin/media/img/gis/move_vertex_on.png'
Copying '/usr/lib/python2.6/site-packages/django/contrib/admin/media/img/gis/move_vertex_off.png'
Copying '/usr/lib/python2.6/site-packages/django/contrib/admin/media/img/admin/icon_clock.gif'
Copying '/usr/lib/python2.6/site-packages/django/contrib/admin/media/img/admin/arrow-down.gif'
Copying '/usr/lib/python2.6/site-packages/django/contrib/admin/media/img/admin/inline-restore.png'
...

因此,为了将其作为RPM安装的一部分运行,我将以下内容添加到spec文件中:

%post
# collect static files
pushd .
cd %{installpath}/src/app/
%{__python} manage.py collectstatic --noinput --settings=settings_prod
popd

问题在于,当我运行它时,我可以看到任务开始了:

 sudo rpm -U app-0.2.8.18889M-1.x86_64.rpm -vv 

 ...
+ pushd .
/ /
+ cd /opt/qpsi/app/src/app/
+ /usr/bin/python2.6 manage.py collectstatic --noinput --settings=settings_prod
/usr/lib/python2.6/site-packages/reversion/__init__.py:31: UserWarning: django-reversion 1.5 is intended for use with django 1.3.0. You are running django 1.3.1, so some features, such as admin integration, may not work. Please see https://github.com/etianen/django-reversion/wiki/Compatible-Django-Versions
  "django_version": format_version(django.VERSION[:3]),
There is no South database module 'south.db.oracle' for your database. Please either choose a supported database, check for SOUTH_DATABASE_ADAPTER[S] settings, or remove South from INSTALLED_APPS.
+ popd

但是在输出中没有预期的文件列表被复制,并且实际上并没有填充静态目录。

所以问题是:

  1. 从RPM中运行我需要注意的python脚本是否有什么特别之处
  2. 我正在使用rpm命令的-vv选项从安装过程中获取详细输出,但是有一种方法可以在python脚本启动后进一步调试rpm内部的内容。
  3. 由于 d。

3 个答案:

答案 0 :(得分:0)

如何对它们进行符号化......

%post
#Configure django admin media if it hasn't already been:
[ -d /path/to/new/media ] || ln -s /usr/lib/python2.6/site-packages/django/contrib/admin/media/ /path/to/new/media

答案 1 :(得分:0)

您应该查看virtualenv(http://pypi.python.org/pypi/virtualenv),然后让您的rpm捆绑整个虚拟环境以及site-packages目录,这样您所需的鸡蛋将在已部署的系统上可用,并且鸡蛋将是您脚本所需的版本。 (在上面的例子中,听起来南方版本可能与您的预期不同)。

然后在%post部分中,从虚拟环境而不是系统python中调用python,

缺蛋问题很容易看到,但由于蛋版本不同而导致的调试问题可能非常微妙。

另请参阅:Deploying Django with virtualenv inside a distribution package?

答案 2 :(得分:0)

我最终将脚本从%post移动到%build。这解决了这个问题。