Skip to content Skip to sidebar Skip to footer

How To Strip Source From Distutils Binary Distributions?

I want to create a bytecode-only distribution from distutils (no really, I do; I know what I'm doing). Using setuptools and the bdist_egg command, you can simply provide the --excl

Solution 1:

The distutils "build_py" command is the one that matters, as it's (indirectly) reused by all the commands that create distributions. If you override the byte_compile(files) method, something like:

try:
    from setuptools.command.build_py import build_py
except ImportError:
    from distutils.command.build_py import build_py

classbuild_py(build_py)
   defbyte_compile(self, files):
       super(build_py, self).byte_compile(files)
       for file in files:
           if file.endswith('.py'):
               os.unlink(file)

setup(
    ...
    cmdclass = dict(build_py=build_py),
    ...
)

You should be able to make it so that the source files are deleted from the build tree before they're copied to the "install" directory (which is a temporary directory when bdist commands invoke them).

Note: I have not tested this code; YMMV.

Solution 2:

Try this:

from distutils.command.install_lib import install_lib

classinstall_lib(install_lib, object):

    """ Class to overload install_lib so we remove .py files from the resulting
    RPM """defrun(self):

        """ Overload the run method and remove all .py files after compilation
        """super(install_lib, self).run()
        for filename in self.install():
            if filename.endswith('.py'):
                os.unlink(filename)

    defget_outputs(self):

        """ Overload the get_outputs method and remove any .py entries in the
        file list """

        filenames = super(install_lib, self).get_outputs()
        return [filename for filename in filenames
                ifnot filename.endswith('.py')]

Solution 3:

Maybe a full working code here :)

try:
        from setuptools.command.build_py import build_py
except ImportError:
        from distutils.command.build_py import build_py

import os
import py_compile

classcustom_build_pyc(build_py):
    defbyte_compile(self, files):
        for file in files:
            if file.endswith('.py'):
                py_compile.compile(file)
                os.unlink(file)
....
setup(
    name= 'sample project',
    cmdclass = dict(build_py=custom_build_pyc),
....

Solution 4:

"the standard commands don't have such an option"?

Do you have the latest version of setuptools installed? And did you write a setup.py file?

If so, this should work: python setup.py bdist_egg --exclude-source-files.

Post a Comment for "How To Strip Source From Distutils Binary Distributions?"