【问题标题】:running Python scripts as part of rpm install process在 rpm 安装过程中运行 Python 脚本
【发布时间】:2011-10-19 18:57:42
【问题描述】:

从 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 安装的一部分运行,我在规范文件中添加了以下内容:

%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 内部发生的事情。

谢谢 D.

【问题讨论】:

    标签: python django rpm rpmbuild


    【解决方案1】:

    仅仅对它们进行符号链接怎么样......

    %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
    

    【讨论】:

    • 我正在利用 Django 1.3 处理静态文件的新方法,所以我认为这不是必要的步骤。当我手动运行 collectstatic 时,管理媒体没有任何问题。
    【解决方案2】:

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

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

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

    另见:Deploying Django with virtualenv inside a distribution package?

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-09-04
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多