最近在Pythonista上开发AppWishList的时候遇到导入自定义模块找不到的问题,经研究发现原来是自己的语法不规范导致的导包失败。
Python导包会有一个搜索路径的问题,当你导入一个模块,Python 解析器对模块位置的搜索顺序是:
- 当前目录
- 如果不在当前目录,Python 则搜索在 shell 变量
PYTHONPATH
下的每个目录。 - 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为
/usr/local/lib/python/
。
模块搜索路径存储在 system
模块的 sys.path
变量中。变量里包含当前目录,PYTHONPATH
和由安装过程决定的默认目录。
所以当要导入自己写的模块的时候应当将该模块的路径加入sys.path
变量中。最简单的办法就是在程序入口的最前面直接写:
1 | import sys |
这样在程序启动时就将当前项目录加入搜索路径,之后导包代码只需要按照项目根目录来写就行了。
当然这样会引发一个问题,就是当你模块里的各个子模块想要调用彼此的时候,直接使用模块名导入就会失败,虽然明明就在同一个目录下但就是找不到。其解决方法是在子模块导入当前目录其他子模块的时候模块名前加一个’.
‘就行了。如:
1 | from .AppModel import App |
参考资料
- 小涂群主
- Python 模块 | 菜鸟教程