Упаковка Python: создайте файл python во время установки, выполните эту работу с помощью

Я хочу сгенерировать файл python во время установки.

Я хочу эту работу как с python setup.py develop, python setup.py install, так и pip install. Пока все хорошо.

Однако я также хочу, чтобы это работало с токсином. Здесь я испытываю проблемы.

Подход, который я использую, заключается в настройке команд develop и install для генерации исходного кода в файле setup.py, например:

# make code as python 3 compatible as possible
from __future__ import absolute_import, division, print_function, unicode_literals

import subprocess
import setuptools
import os.path
import distutils.core

from setuptools.command.develop import develop
from setuptools.command.install import install


# Build anltr files on installation
#   this is such a mess... it looks like there are
#   no common steps to develop and install

class AntlrDevelopCommand(develop):
    def run(self):
        compile_grammar()
        develop.run(self)

class AntlrInstallCommand(install):
    def run(self):
        compile_grammar()
        install.run(self)

def compile_grammar():
    here = os.path.dirname(__file__) or '.'
    package_dir = os.path.join(here, 'latex2sympy')
    subprocess.check_output(['antlr4',  'PS.g4', '-o', 'gen'], cwd=package_dir)

setuptools.setup(
    name='latex2sympy',
    version=0.1,
    author='august.codes',
    author_email='[email protected]',
    description='Parse latex markup into sympy: suitable for programmatic modifcation',
    license='GPLv3',
    keywords='MIT',
    url='',
    packages=['latex2sympy'],
    classifiers=[
],
    install_requires=['antlr-ast',  'sympy'],
    cmdclass=dict(
        install=AntlrInstallCommand,
        develop=AntlrDevelopCommand),
    test_suite='nose.collector'
)

Однако метод установки tox кажется каким-то образом запускать setup.py вдали от моего исходного кода, а магический черный ящик, который tox представляет, заставляет задуматься, что происходит.

Проблема, похоже, сводится к этой магии вуду, которая тянет в setup.py, запускает ее через exec.... по какой-то причине.

Command "/home/tom/active/latex2sympy/.tox/py35/bin/python3.5 -u -c "import setuptools, tokenize;__file__='/tmp/pip-e698cucb-build/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-lu2idbzz-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/tom/active/latex2sympy/.tox/py35/include/site/python3.5/latex2sympy" failed with error code 1 in /tmp/pip-e698cucb-build/

Что я пробовал:

  • Работа с -v -v -v -v
  • Повторная перезагрузка команды pip
  • Добавление pdb.set_trace (команда зависает, и я не вижу вывод)
  • Добавление оболочки ipython (ipython no установлено даже в install_required)
  • Запуск strace -F показывает, что setup.py действительно находится в ожидаемом местоположении относительно исходного кода

Вещи, которые я решил попробовать:

  • Создание сетевой backdoor-оболочки во время выполнения (слишком ленив)

Ответы

Ответ 1

В файле tox.ini вашего проекта вы можете добавить commands для запуска в тестовых средах. Простой пример выглядит примерно так:

[tox]
envlist = py27,py34,py35,py36

[testenv]
deps=
    pytest
    ; ... other dependencies
commands= 
    pytest --basetemp={envtmpdir} {posargs}
    ; Add your command here?

Возможно ли, чтобы вы добавили команду, чтобы сделать ток делать то, что вы хотите? (Команда будет выполняться для каждой из сред).