不幸的是,我必须在需要使用pipenv
包的项目中使用py.xml
(不是我的决定)和Python 3(再次,不是我的决定)。它还需要通过pylint
验证。
此项目中的一个文件包含:
from py.xml import html
即使py
安装在虚拟环境中,pylint
找不到它,但它可以找到它。这似乎更像pylint
的问题,但可能不是。我不知道如何调试这个烂摊子。以下是pylint
分裂人格的证据:
PYTHONPATH=$(pwd) pipenv run pylint --init-hook 'from py.xml import html;print(type(html))' some_module
<class 'py._xmlgen.NamespaceMetaclass'>
************* Module some_module
E: 8, 0: No name 'xml' in module 'py' (no-name-in-module)
E: 8, 0: Unable to import 'py.xml' (import-error)
不确定我是否在上面的行中获得任何奖励业力点,但如果你对虚拟化的概念不熟悉,我可能会在这里做一点说明:
在运行应该设置虚拟环境的程序时指定PYTHONPATH是没有意义的,但是,对于它包含的所有无意义代码的负载,它应该做的唯一事情,它没有。实际上甚至没有尝试。
哦,如果您认为py
可能已安装在其他地方,pylint
无法访问......嗯,它不是:
PYTHONPATH=$(pwd) pipenv run pylint --init-hook 'from py.xml import html;import inspect;print(inspect.getfile(html))' automation
/home/wvxvw/.local/share/virtualenvs/some_module-UoeXL6dQ/lib/python3.5/site-packages/py/_xmlgen.py
************* Module automation.conftest
E: 8, 0: No name 'xml' in module 'py' (no-name-in-module)
E: 8, 0: Unable to import 'py.xml' (import-error)
答案 0 :(得分:2)
要从source判断,py
命名空间中的属性是动态创建的,这就是静态分析工具pylint无法识别它们的原因:
apipkg.initpkg(__name__, attr={'_apipkg': apipkg}, exportdefs={
...
# small and mean xml/html generation
'xml' : {
'__doc__' : '._xmlgen:__doc__',
'html' : '._xmlgen:html',
'Tag' : '._xmlgen:Tag',
'raw' : '._xmlgen:raw',
'Namespace' : '._xmlgen:Namespace',
'escape' : '._xmlgen:escape',
},
})
如果您的项目需要使用pylint合规性,那么您需要同意可以忽略对这些导入的警告。