py.test尝试在Travis上导入错误的模块,但不在本地导入

时间:2016-07-28 17:47:35

标签: travis-ci pytest

我有a Travis CI build that is failing; py.test似乎试图导入错误的模块,但我无法在本地重现。我希望它可以导入tools.lint.tests.test_lint,而不是lint.tests.test_lint,因为您可以在回溯中看到,因为构建有--full-trace!当它尝试从工具包中进行相对导入时,会导致其下方出现错误。

短暂的引用是:

___________________ 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

鉴于顶级包的名称只是repo所在的目录,我不会惊讶地看到它们有所不同 - 但我仍然期望在那里看到它!

1 个答案:

答案 0 :(得分:0)

查看Travis在该文件中的路径:/home/travis/build/w3c/wpt-tools/lint/tests/test_lint.py。您的计算机上名为tools的目录在Travis上名为wpt-tools,跟随GitHub上的回购名称。

从本质上讲,wpt-tools并不是一个有效的Python包名,因为Python包不能在名称中包含连字符。 (他们必须是identifier)。这导致py.test得出结论它不是包,尽管其中包含__init__.py,因此它不会将其包含在导入路径中,导致代码尝试时出错相对导入的意义是顶级包。

这里有几个解决方案:

  • 可能很简单的就是重命名存储库,使其不包含任何连字符,但很明显,如果你是一个已建立的存储库,这可能是不可取的。

  • 让Travis CI从某个目录运行代码,方法是在before_install开头将存储库复制/移动到名称不包含连字符的目录,使用类似的东西:

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

    这将运行/tmp/tools的所有安装和后续步骤,这将允许所有内容按预期运行。

    (注意你不能在这里使用符号链接,因为Python中的os.getcwd()将消除路径中的链接,返回真实路径,导致看似变通方法根本无法工作。)