[Distutils] stdeb-0.3 error

Gerry Reno greno at verizon.net
Tue Sep 22 19:57:23 CEST 2009

Andrew Straw wrote:
> Gerry Reno wrote:
>> So now everything is working on hardy except for the fact that stdeb 0.3
>> has to be modified to remove the --single-version-externally-managed
>> option. So can you just create a 0.3a version with this small change and
>> that could go out to the repositories and be available by default to
>> everyone. There does not seem to be any impact that I can see in making
>> this change and since so many people create their own install classes
>> this would actually prevent conflicts.
> I figured out what the reason for --single-version-externally-managed is
> -- it is required for namespace packages to function properly. Thus, I
> can't remove it, as doing so would be a regression.
> However, if you create a patch I can apply against the old-stable branch
> that makes this optional, (e.g. set in a similar way as the
> --ignore-install-requires option), I can add that and make release
> 0.3.1. 
Ok, I'll look at getting you a patch that removes the option.

> Note also that I'm very close to releasing 0.4, as the 0.3 line
> has major problems with Jaunty and later.
> Are you planning to submit a patch for the bdist_deb command? I could
> include that, too.
Yes, I have something ready but I think the 'bdist_deb' command belongs 
as a distutils patch.  I created the command by subclassing the 
distutils Command class.  Maybe Tarek could comment on what might be 
best here. 

Here is my working 'bdist_deb' code verbatim from inside my setup.py:
(it could be more pythonic of course with less os.system commands but 
it's working real well this way at least)

# Copyright 2009 Gerry Reno. 

# stdeb note:
# stdeb 0.3 needs its util.py modified to remove the install
# option "--single-version-externally-managed" otherwise
# if you have subclassed the distutils install class to
# create your own "install" class (rather common) you will
# get an "unrecognized option" error when using 'bdist_deb'.
# I had to make this change to stdeb in order to get stdeb to work
# on Ubuntu Hardy with a setup.py that defined its own install.

from distutils.core import Command

if sys.hexversion >= 0x020500F0:
        import stdeb
elif sys.argv[1] == 'bdist_deb':
        print sys.argv[1], "requires python >= 2.5"
        raise SystemExit(1)

class bdist_deb(Command):
    # creates .deb pkg from a .dsc file that is generated using stdeb module
    # requires stdeb, dpkg-dev, build-essential, python-all-dev, 
debhelper, python-support, fakeroot
    # to add 'postinst' and friends just create a debian/ control 
directory in the home directory of your
    # application and add a file 'python-myapp.postinst' and it will be 
run post package installation.

    description = 'Create debian-style source (.dsc using stdeb module) 
and binary (.deb) packages'

    user_options = [    ('install-dir=', 'd', "directory to install the 
files to"),

    def initialize_options (self):
        self.install_dir = None
        self.outfiles = []

    def finalize_options (self):

    def run(self):
        import setuptools
        import commands

        # run a sub_command  (gen .dsc source pkg using stdeb)

        # save current directory
        setup_dir = os.getcwd()

        # define system command to execute  (find source pkg work tree)
        syscmd = ['find', 'deb_dist', '-mindepth', '1', '-maxdepth', 
'1', '-type', 'd',]

        # execute system command and read output  (execute and read 
output of find cmd)
        dsc_tree = strip(subprocess.Popen(syscmd, 
stdout=subprocess.PIPE).communicate()[0])  # strip needed to remove CR

        # use system command output  (change directory to work tree)

        # define system command to execute  (gen .deb binary pkg)
        syscmd = 'dpkg-buildpackage -rfakeroot -uc -us'

        # execute system command
        if os.system(syscmd) == 0:
                print '.deb successfully created in deb_dist/'
                print 'problem creating .deb'

        # (change directory back to setup dir)

setup(name             = name,

      # add new bdist_deb command here
      cmdclass         = {
            'bdist_deb' : bdist_deb,



More information about the Distutils-SIG mailing list