setup.py install and bdist_egg

Discussion in 'Python' started by Jasiu, Mar 13, 2009.

  1. Jasiu

    Jasiu Guest

    Hey,

    I work at a company where I'm lucky enough to write web apps using
    Python and WSGI :). We develop more and more stuff in Python and it's
    becoming a mess of dependencies, so we thought we would create a
    guideline for developers that describes the whole process of deploying
    a Python app on a server. Since all of our servers run Debian, all of
    our software has to be installed as Debian packages - other
    departments that don't use Python (shame on them! :D) already follow
    this policy.

    Here is what we have figured so far:
    1) Write your code.
    2) Prepare setup.py, and put names of required eggs in there.
    3) Write a Debian wrapper that uses CDBS Python class, and put names
    of required Debian packages in there.
    4) Build Debian package.
    5) Done! Deploy on server and have fun :).

    This guideline already works pretty well for us, but I thought I could
    tweak it a little. I want to make the Debian package wrapper as thin
    as possible so that if we ever stop using Debian, we will still be
    able to deploy all of our software as eggs. This goal turned to be
    pretty challenging. I have a few questions.

    1) Debian has a debian/dirs file where you can list all the
    directories that the package should create, for example those in /var/
    log, /var/lib . I already figured out that I can use setup.py
    'install_data' keyword for that, even for empty directories. Then I
    can use 'setup.py install' command and things work great. But... How
    about eggs? I'd like my egg to somehow contain or create such
    directories. For example, I have a config file that I want to place
    in /etc directory. I can do that using 'setup.py install', but
    'setup.py bdist_egg' will just create an egg containing etc/
    directory. Can I do something about it? Also, why doesn't an egg
    contain empty dirs that I place in install_data?

    2) What about file permissions? Can they be set by setup.py? My
    software runs as www-data user and so /var/log and /var/lib
    directories should have proper owner, group and permissions. I didn't
    figure out a way to change permissions using setup.py. In Debian I can
    use postinst script for that.

    If anything sounds unclear, blame my bad english :).

    Regards,

    Mike
     
    Jasiu, Mar 13, 2009
    #1
    1. Advertising

  2. Jasiu

    Hyuga Guest

    On Mar 13, 4:41 pm, Jasiu <> wrote:
    > Hey,
    >
    > I work at a company where I'm lucky enough to write web apps using
    > Python and WSGI :). We develop more and more stuff in Python and it's
    > becoming a mess of dependencies, so we thought we would create a
    > guideline for developers that describes the whole process of deploying
    > a Python app on a server. Since all of our servers run Debian, all of
    > our software has to be installed as Debian packages - other
    > departments that don't use Python (shame on them! :D) already follow
    > this policy.
    >
    > Here is what we have figured so far:
    > 1) Write your code.
    > 2) Prepare setup.py, and put names of required eggs in there.
    > 3) Write a Debian wrapper that uses CDBS Python class, and put names
    > of required Debian packages in there.
    > 4) Build Debian package.
    > 5) Done! Deploy on server and have fun :).
    >
    > This guideline already works pretty well for us, but I thought I could
    > tweak it a little. I want to make the Debian package wrapper as thin
    > as possible so that if we ever stop using Debian, we will still be
    > able to deploy all of our software as eggs. This goal turned to be
    > pretty challenging. I have a few questions.


    Glad to see I'm not the only one with this sort of challenge. Though
    it sounds like you're already a step ahead of me in that you're
    properly maintaining requirements/dependencies for your Python
    packages. When I build my Debian packages I make sure that *they*
    have the correct dependencies. But my setup.py files do not have all
    their dependencies listed, so it's a pain to get everything set up
    correctly when not doing it through the Debian package system.

    > 1) Debian has a debian/dirs file where you can list all the
    > directories that the package should create, for example those in /var/
    > log, /var/lib . I already figured out that I can use setup.py
    > 'install_data' keyword for that, even for empty directories. Then I
    > can use 'setup.py install' command and things work great. But... How
    > about eggs? I'd like my egg to somehow contain or create such
    > directories. For example, I have a config file that I want to place
    > in /etc directory. I can do that using 'setup.py install', but
    > 'setup.py bdist_egg' will just create an egg containing etc/
    > directory. Can I do something about it? Also, why doesn't an egg
    > contain empty dirs that I place in install_data?


    My approach to this has been to use a postinst script to copy files
    out of the eggs (or when I'm not installing as an egg, from /usr/
    share) to the correct locations in /etc. However, this doesn't work
    so well if you're not using a Debian package. But see below:

    > 2) What about file permissions? Can they be set by setup.py? My
    > software runs as www-data user and so /var/log and /var/lib
    > directories should have proper owner, group and permissions. I didn't
    > figure out a way to change permissions using setup.py. In Debian I can
    > use postinst script for that.


    I'm also using a postinst script for configuring my system, but I want
    to move away from that. I already have a command-line tool for easily
    administering certain aspects of the system. So my plan is to
    implement a "deploy" command that creates all the directories with the
    correct permissions, generates the config files, and performs all the
    configuration my postinst script currently does. Then the postinst
    script simply needs to call the deploy command. That way I can take
    advantage of debconf without being dependent on it.

    > If anything sounds unclear, blame my bad english :).


    Sounds perfectly clear to me!
     
    Hyuga, Mar 16, 2009
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. David Lozzi

    Setup and Install of my App

    David Lozzi, Sep 24, 2006, in forum: ASP .Net
    Replies:
    0
    Views:
    305
    David Lozzi
    Sep 24, 2006
  2. Chris Shenton
    Replies:
    1
    Views:
    1,453
    =?ISO-8859-1?Q?Michael_Str=F6der?=
    Aug 24, 2007
  3. Mike Kent
    Replies:
    0
    Views:
    626
    Mike Kent
    Apr 16, 2009
  4. Kushal Kumaran
    Replies:
    3
    Views:
    338
  5. Intransition

    [ANN] Ruby Setup 5 (setup.rb)

    Intransition, Jan 13, 2010, in forum: Ruby
    Replies:
    0
    Views:
    420
    Intransition
    Jan 13, 2010
Loading...

Share This Page