我确实使用
pylint
在单元测试中运行 subprocess.run()
。
我需要使用 --init-hook=
的 pylint
功能来鼓励它找到我的模块。
我确实在 shell (bash) 上运行它,它按预期工作:
pylint qttools.py --disable=all --enable=E0401 --init-hook="from pathlib import Path; import sys;sys.path.append('./../common');"
未检测到错误 E0401。
现在我尝试复制它,但使用
subprocess.run()
。
Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from subprocess import run
>>> cmd = ['pylint', 'qttools.py', '--disable=all', '--enable=E0401']
>>> cmd.append('--init-hook="from pathlib import Path; import sys;sys.path.append(\'./../common\');"')
>>> run(cmd)
************* Module qttools
qttools.py:48:0: E0401: Unable to import 'snapshots' (import-error)
qttools.py:49:0: E0401: Unable to import 'tools' (import-error)
qttools.py:50:0: E0401: Unable to import 'logger' (import-error)
-------------------------------------------------------------------
Your code has been rated at 9.55/10 (previous run: 10.00/10, -0.45)
CompletedProcess(args=['pylint', 'qttools.py', '--disable=all', '--enable=E0401', '--init-hook="from pathlib import Path; import sys;sys.path.append(\'./../common\');"'], returncode=2)
我的假设是,逃离
'
路径周围的 common
是一个问题。我尝试了一些替代方案(切换 '
和 "
;通过 +
运算符构建字符串)。结果保持不变。
有什么想法吗?
编辑:顺便说一句:我知道如果我从这个存储库中创建一个正确且有效的Python包,我就不需要使用像这样的
--init-hook
或sys.path
hacks。我正在研究这个,但它是 15 年前的臭 Python 代码。一步接着一步。 ;)
我明白了。问题是我用
--init-hook
包围了 "
的值。
>>> cmd.append('--init-hook="from pathlib import Path; import ..."')
^ ^
删除它效果很好。
>>> cmd.append('--init-hook=from pathlib import Path; import sys;sys.path.append(\'./../common\');')