如果您想从交给pylint的当前模块/文件开始查找模块的根,可以使用这个方法。
[MASTER]
init-hook=sys.path += [os.path.abspath(os.path.join(os.path.sep, *sys.argv[-1].split(os.sep)[:i])) for i, _ in enumerate(sys.argv[-1].split(os.sep)) if os.path.isdir(os.path.abspath(os.path.join(os.path.sep, *sys.argv[-1].split(os.sep)[:i], '.git')))][::-1]
如果你有一个python模块~/code/mymodule/,它的顶级目录布局是这样的
~/code/mymodule/
├── .pylintrc
├── mymodule/
│ └── src.py
└── tests/
└── test_src.py
然后这将把~/code/mymodule/添加到你的python路径中,并允许pylint在你的IDE中运行,即使你正在导入mymodule。SRC在tests/test_src.py中。
你可以用.pylintrc来代替检查,但当涉及到python模块的根目录时,git目录通常是你想要的。
在你问之前
使用import sys, os;Sys.path.append(…)缺少一些东西来证明我的答案的格式。我通常不这样写代码,但在这种情况下,您将受困于处理pylintrc配置解析器和求值器的局限性。它实际上是在init_hook回调的上下文中运行exec,因此任何导入pathlib的尝试,使用多行语句,将一些东西存储到变量中,等等,都不会工作。
我的代码的一种不那么恶心的形式可能是这样的:
import os
import sys
def look_for_git_dirs(filename):
has_git_dir = []
filename_parts = filename.split(os.sep)
for i, _ in enumerate(filename_parts):
filename_part = os.path.abspath(os.path.join(os.path.sep, *filename_parts[:i]))
if os.path.isdir(os.path.join(filename_part, '.git')):
has_git_dir.append(filename_part)
return has_git_dir[::-1]
# don't use .append() in case there's < 1 or > 1 matches found
sys.path += look_for_git_dirs(sys.argv[-1])
我希望我可以使用pathlib.Path(文件名)。父母们,这样事情就容易多了。