2017-05-10 2 views
15

Je veux générer un fichier python au moment de l'installation.Emballage Python: Générer un fichier python au moment de l'installation, avoir ce travail avec tox

Je veux ce travail avec les deux python setup.py develop, python setup.py install et pip install. Jusqu'ici tout va bien.

Cependant, je veux aussi que cela fonctionne avec tox. C'est là que j'ai des problèmes.

L'approche que je l'aide est de modifier les commandes develop et install pour générer le code source dans setup.py comme ceci:

# 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' 
) 

Cependant la méthode de tox d'installation semble fonctionner en quelque sorte setup.py loin de ma source code et la boîte noire magique que tox représente rend un peu exaspérant pour comprendre ce qui se passe.

Le problème semble être dû à cette magie vaudou qui tire dans setup.py l'exécute via un exec .... pour une raison quelconque.

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/ 

choses que j'ai essayé:

  • Courir avec -v -v -v -v
  • Reruning la commande pip manuellement
  • Ajout d'un pdb.set_trace (commande se bloque et je ne pas voir la sortie)
  • Ajout d'un shell ipython (ipython non installé même dans install_required)
  • Exécution d'un strace -F cela montre que setup.py est en effet à l'emplacement prévu par rapport au code source

choses que j'ai envisagé d'essayer:

  • Création d'un shell de porte dérobée réseau au moment de l'exécution (trop paresseux)
+0

Apparemment, la prise en charge de l'interpréteur hérité tox pour gérer PEP 263 définit ('tokenize.open' appelle implicitement' detect_encoding') et modifie les lignes de nouvelles MS en newix * nix. Je dirais que c'est un problème entre pip (je suppose que c'est ce qui est en train de changer les dirs de '' pip - * - build' ') en passant à tox? – cowbert

+0

J'imagine que vous voulez utiliser des tests pour tester, donc est-ce que ce serait un problème de spécifier 'usedevelop = True' dans le fichier tox.ini? C'est plus une solution de contournement, mais cela peut suffire pour votre cas d'utilisation. – bow

Répondre

0

Dans le tox.ini -file de votre projet, vous pouvez ajouter commands être exécuter dans les environnements de test. Un exemple simple ressemble à ceci:

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

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

Est-il possible que vous ajoutiez une commande pour que tox fasse ce que vous voulez? (La commande sera exécutée pour chacun des environnements).