存在同名兄弟目录场景下,无需手动修改sys.path或调整固定PYTHONPATH的Python模块导入方法
解决Python导入根目录scripts包的问题(无需修改sys.path)
首先咱们明确核心问题:直接运行asdf/mycode.py时,Python会把asdf目录加入模块搜索路径,导致它优先查找asdf/scripts而非根目录的scripts。在PYTHONPATH必须设为":"的前提下,有个更优雅的解决方案,不用手动修改sys.path。
最佳方案:用-m参数以模块方式运行脚本
Python的-m参数专门用来解决这类模块导入问题——它会把当前工作目录(也就是项目根目录python-test)加入到模块搜索路径的最前面,让Python能正确识别顶层包。
具体操作步骤:
- 切换到项目根目录
python-test下 - 执行以下命令:
PYTHONPATH=: python -m asdf.mycode
运行后,import scripts.mymod就会正确找到根目录下的scripts包,顺利输出hello world。
为什么这个方法有效?
直接运行脚本(python asdf/mycode.py)时,Python会把脚本所在的asdf目录添加到sys.path开头,所以它会先在asdf下找scripts;而用-m运行模块时,Python会把当前工作目录(项目根)加入sys.path,这时候顶层的scripts包就会被优先识别,自然就能正确导入了。
备选方案:使用绝对导入(需配合包结构)
如果你不想用-m参数,也可以修改asdf/mycode.py的导入语句为绝对导入形式:
from python_test.scripts import mymod
不过这种方式要求你把整个python-test目录当作一个包(它已经有__init__.py了),并且需要在项目根目录的上级目录运行脚本,或者确保python-test在sys.path中。相比之下,-m的方式更灵活,不需要修改代码。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

