配置pylint
在.pylintrc中禁用wrong-import-position检查程序是最简单的解决方案,但会丢弃有效的警告。
更好的解决方案是告诉pylint忽略这些导入的wrong-import-position,内联。误报导入可以嵌套在enable disable块中,而不会丢失其他任何覆盖范围:import sys
sys.path.insert(0, './bar')
#pylint: disable=wrong-import-position
from bar.eggs import Eggs
from foo.ham import Ham
#pylint: enable=wrong-import-position
Ham()
# Still caught
import something_else
然而,如果wrong-import-order在.pylintrc中被禁用,这确实有一个轻微的缺陷,即风趣。
避免修改sys.path
有时不需要的绒线警告源于错误地开始处理问题。我已经想出了很多方法来避免首先修改sys.path,尽管它们不适用于我自己的情况。
也许最直接的方法是修改PYTHONPATH以包含子模块目录。但是,这必须在每次调用应用程序时指定,或者在系统/用户级别上修改,这可能会损害其他进程。变量可以在包装外壳或批处理脚本中设置,但这需要进一步的环境假设或限制对Python调用的更改。
一种更现代、更少麻烦的模拟方法是在虚拟环境中安装应用程序,并简单地将子模块路径添加到虚拟环境中。
如果子模块包含setuptools setup.py,则可以简单地安装它,从而避免了路径定制。这可以通过维护对诸如pypi(私有包的非起始者)之类的存储库的发布,或者通过利用/滥用pip install -e直接或从其存储库安装子模块包来实现。虚拟环境再次通过避免潜在的跨应用程序冲突和权限问题,使此解决方案更加简单。
如果目标操作系统集可以限制为具有强符号链接支持的操作系统集(实际上,这至少排除了10个窗口中的所有窗口),则子模块可以链接到以绕过包装目录,并将目标包直接放在工作目录中:foo/
bar/ --> bar_src/bar
bar_src/
bar/
__init__.py
eggs.py
test/
setup.py
foo/
__init__.py
ham.py
main.py
这样做的缺点是限制了应用程序的潜在用户,并用混乱的混乱填充了foo目录,但在某些情况下可能是一个可接受的解决方案。