2017-05-10 1 views
15

Ich möchte eine Python-Datei zur Installationszeit erzeugen.Python-Verpackung: Generiere eine Python-Datei zur Installationszeit, lass das mit Tox arbeiten

Ich möchte diese Arbeit mit beiden python setup.py develop, python setup.py install und pip install. So weit, ist es gut.

Allerdings möchte ich auch dies mit tox arbeiten. Hier habe ich Probleme.

Der Ansatz, den ich verwende, ist die develop und install Befehle zwicken Quellcode in setup.py zu erzeugen, etwa so:

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

jedoch tox ‚s Methode der Installation scheint irgendwie setup.py wegzulaufen von meiner Quelle Code und die magische Blackbox, die tox darstellt, macht es irgendwie ärgerlich, um herauszufinden, was los ist.

Das Problem scheint zu diesem Voodoo Magie, die in setup.py zieht es über eine exec .... aus irgendeinem Grund.

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/ 

Dinge, die ich habe versucht:

  • Laufen mit -v -v -v -v
  • Reruning den Pip-Befehl manuell
  • ein pdb.set_trace (Befehl hängt Hinzufügen und ich Ausgabe nicht sehen)
  • Hinzufügen einer ipython-Shell (ipython no installiert, selbst wenn in install_required)
  • ein strace -F Lauf dies zeigt, dass setup.py ist in der Tat in dem erwarteten Position in Bezug auf den Quellcode

Dinge, die ich habe versucht, in Betracht gezogen:

  • ein Netzwerk Backdoor-Shell zur Laufzeit erstellen (zu faul)
+0

Sieht aus wie tox Legacy-Interpreter-Unterstützung zu behandeln PEP 263 definiert ('tokenize.open' implizit ruft' detect_encoding') und ändert MS Zeilenumbrüche zu * nix Zeilenumbrüche. Ich würde sagen, das ist ein Problem zwischen Pip (ich nehme an, dass es das ist, was die 'pip - * - build' dirs), die an tox ausgibt? – cowbert

+0

Ich stelle mir vor, Sie möchten tox für das Testen verwenden, also wäre es ein Problem, 'usedevelop = True' in der tox.ini-Datei anzugeben? Dies ist eher eine Problemumgehung, aber es kann für Ihren Anwendungsfall ausreichen. – bow

Antwort

0

im tox.ini -Datei Ihres Projekts Sie commands hinzufügen können, um zu sein in den Testumgebungen laufen. Ein einfaches Beispiel sieht etwa so aus:

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

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

Ist es möglich, dass Sie einen Befehl hinzufügen, um tox zu machen, was Sie wollen? (Der Befehl wird für jeder der Umgebungen ausgeführt).

Verwandte Themen