Как убрать источник из бинарных дистрибутивов distutils? - PullRequest
8 голосов
/ 09 августа 2010

Я хочу создать дистрибутив только для байт-кода из distutils (на самом деле, нет, я знаю, что я делаю).Используя setuptools и команду bdist_egg, вы можете просто указать параметр --exclude-source.К сожалению, стандартные команды не имеют такой опции.

  • Существует ли простой способ удаления исходных файлов непосредственно перед созданием tar.gz, zip, rpm или deb.1005 * Существует ли относительно чистый способ выполнения команд (например, только для tar.gz или zip).

Ответы [ 4 ]

11 голосов
/ 10 августа 2010

Важна команда 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 голос
/ 18 апреля 2015

Может быть, полный рабочий код здесь:)

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),
....
1 голос
/ 09 октября 2013

Попробуйте это:

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')]
0 голосов
/ 22 сентября 2016

«у стандартных команд такой опции нет»?

У вас установлена ​​последняя версия setuptools?И вы написали setup.py файл?

Если так, это должно работать: python setup.py bdist_egg --exclude-source-files.

...