2016-07-28 23 views
0

Ich habe a Travis CI build that is failing; py.test scheint zu versuchen, das falsche Modul zu importieren, obwohl ich das lokal nicht reproduzieren kann. Ich erwarte, dass es importiert tools.lint.tests.test_lint, nicht lint.tests.test_lint, wie Sie im Traceback sehen können, vorausgesetzt, dass Build --full-trace hat! Dies führt zu dem darunter liegenden Fehler, wenn versucht wird, einen relativen Import aus dem Toolpaket durchzuführen.py.test versucht, falsches Modul auf Travis zu importieren, aber nicht lokal

Die kurze Trackback ist:

___________________ ERROR collecting lint/tests/test_lint.py ___________________ 
.tox/py27/lib/python2.7/site-packages/py/_path/local.py:650: in pyimport 
    __import__(modname) 
lint/__init__.py:1: in <module> 
    from . import lint 
lint/lint.py:15: in <module> 
    from .. import localpaths 
E ValueError: Attempted relative import beyond toplevel package 

der Name des Top-Level-Pakets Gegeben ist nur das Verzeichnis, dass die Repo-in ist, würde ich nicht überrascht, zu sehen, dass-unterscheiden, aber ich würde immer noch erwarte es dort zu sehen!

Antwort

0

Werfen Sie einen Blick auf den Pfad Travis hat diese Datei unter: /home/travis/build/w3c/wpt-tools/lint/tests/test_lint.py. Das Verzeichnis tools auf Ihrem Computer heißt auf Travis wpt-tools und folgt dem Namen des Repos auf GitHub.

Vitally, wpt-tools ist kein gültiger Python-Paketname, da Python-Pakete keine Bindestriche im Namen enthalten können. (Sie müssen ein identifier sein). Dies führt py.test zum Schluss, es ist kein Paket, trotz der darin enthaltenen __init__.py, und daher ist es nicht in den Importpfad enthalten, was zu dem Fehler führt, wenn Code versucht einen relativen Import von dem, was die Spitze sein soll- Level-Paket.

Es gibt ein paar Lösungen hier:

  • Die möglicherweise einfach man das Repository umbenennen, so dass es keine Bindestriche enthält, obwohl offensichtlich, wenn Sie ein etabliertes Repository sind dies wahrscheinlich nicht wünschenswert ist.

  • Erhalten Travis CI den Code aus einem Verzeichnis, durch Kopieren/Verschieben des Repositorys in einem Verzeichnis, dessen Name nicht enthält einen Bindestrich, zu Beginn der before_install, mit so etwas wie laufen:

    before_install: 
        - mv `pwd` /tmp/tools 
        - cd /tmp/tools 
    

    Dann werden alle Installations- und späteren Schritte von /tmp/tools ausgeführt, wodurch alles wie erwartet ausgeführt werden kann.

    (Hinweis: Sie können nicht einen symbolischen Link hier als os.getcwd() in Python verwenden den Link aus dem Weg zu beseitigen, den echten Pfad zurückkehrt, führt, dass Abhilfe schien gar nicht zu arbeiten.)