我有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所在的目录,我不会惊讶地看到它们有所不同 - 但我仍然期望在那里看到它!
答案 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()
将消除路径中的链接,返回真实路径,导致看似变通方法根本无法工作。)