如何从distutils二进制发行版中剥离源代码?

时间:2010-08-09 12:35:39

标签: python bytecode distutils

我想从distutils创建一个仅字节码的分发(不是,我知道;我知道我在做什么)。使用setuptools和bdist_egg命令,您只需提供--exclude-source参数即可。不幸的是,标准命令没有这样的选项。

  • 是否有一种简单的方法可以在创建tar.gz,zip,rpm或deb之前删除源文件。
  • 是否有相对干净的按命令方式(例如,仅用于tar.gz或zip)。

4 个答案:

答案 0 :(得分:11)

distutils“build_py”命令是重要的,因为它(间接地)被创建分发的所有命令重用。如果覆盖byte_compile(files)方法,例如:

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

class build_py(build_py)
   def byte_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),
    ...
)

您应该能够创建它,以便在将源文件复制到“install”目录(当bdist命令调用它们时是临时目录)之前从构建树中删除它们。

注意:我没有测试过这段代码; YMMV。

答案 1 :(得分:1)

试试这个:

from distutils.command.install_lib import install_lib

class install_lib(install_lib, object):

    """ Class to overload install_lib so we remove .py files from the resulting
    RPM """

    def run(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)

    def get_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
                if not filename.endswith('.py')]

答案 2 :(得分:1)

这里可能是一个完整的代码:)

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

import os
import py_compile

class custom_build_pyc(build_py):
    def byte_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),
....

答案 3 :(得分:0)

“标准命令没有这样的选项”?

您是否安装了最新版本的setuptools?你写了一个setup.py文件吗?

如果是这样,这应该有效:python setup.py bdist_egg --exclude-source-files