在我刚学习python时,做模块导入最长碰到的就是这个错误,我明明定义了 run_api
模块,但是却总是报找不到的错误, No module No module No你妹啊,如果你也碰到这
样的问题,你应该好好看看这篇文章
不太好的解决办法
1 2 3 |
import sys import os sys.path.append( os.path.join( os.path.dirname(__file__), os.path.pardir ) ) |
在 google 模块导入问题的时候,大部分博客给出了这样的解决方案,在每个文件配置
这样的代码,他做到了将当前文件的路径加入到 Python 模块搜索路径 sys.path 中,
确实可以起到解决 bug 的作用,但是每个文件都写上这样一段代码,实在让人不舒服,
下面我们还是来学习下 Python 模块搜索路径是如何运作的
Python 从哪些路径导入模块
主目录
Python 首先会在主目录内搜索导入的文件。如果程序完全位于单一目录,所有导入的会
自动工作,而并不需要配置路径。由于这个目录总是先搜索,其文件也将覆盖路径上的
其他目录中具有同样名称的模块。如果你需要在自己程序中使用库模块的话,小心不要
以这种方式以外地隐藏库模块。
PYTHONPATH 目录
之后,Python 会从左到右搜索 PYTHONPATH 环境变量设置中罗列出的所有目录,可以是
用户定义或平台特定的目录名。因为 Python 优先搜索主目录,当导入的文件跨目录时,
这个设置才显得格外重要。
标准库目录
接着,Python 会自动搜索标准库模块安装在机器上的那些目录,这块通常不需要在单独
配置
.pth 文件目录
最后,Python 有个相当新的功能,允许用户把有效的目录添加到模块搜索路径中去,
也就是在后缀名为 .pth (路径的意思)的文本文件中一行一行的列出目录。他是
PYTHONPATH 的一种替代方案,我们也可以把它放在标注库所在位置的 sitepackages 的
子目录中扩展模块搜索路径
应用到当前项目
在开发大型项目之前,我们可以将项目根目录作为 PYTHONPATH 存到环境变量中,也可以
每次运行前之前该命令
1 2 3 4 5 6 |
$ touch env.sh $ vim env.sh export PYTHONPATH=./ # 将项目根目录作为PYTHONPATH $ source env.sh # 在项目运行之前执行该命令 |
最后我们可以通过下面两行代码来查看当前项目python模块搜索路径和导入的模块
1 2 3 4 5 |
import sys print(sys.path) # 输出python模块搜索目录 print(list(sys.modules.keys())) # 输出python已经导入的模块列表 |
应用到全局
PYTHONPATH 只是 python 使用的环境变量,PATH 主要是 shell 使用,其他程序可能也会使用的环境变量。所以最好添加PYTHONPATH路径。
添加路径:
- /etc/profile (建议不修改这个文件 )
全局(公有)配置,不管是哪个用户,登录时都会读取该文件。 - /etc/bashrc (一般在这个文件中添加系统级环境变量)
全局(公有)配置,bash shell执行时,不管是何种方式,都会读取此文件。 - ~/.bash_profile (一般在这个文件中添加用户级环境变量)
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!
路径修改方法:
整个修改$ export PYTHONPATH=/xxx:/xxx
添加单个$export PYTHONPATH=/xxx:$PYTHONPATH
但这样重启中断后就恢复原样了。所以应该打开/etc/bashrc 在底下添加
export PYTHONPATH=/DIR1:/DIR2:$PYTHONPATH
Python路径
Python版本和路径
$which python2:就可以看到输入python2调用的是哪一个python文件;
$python2 -V:就可以看到输入python2调用的python文件是哪一个版本 。
比如我$which python 得到/usr/local/bin/python。然后$ python -V得到Python 3.6.1 表示我输入python后使用的是这个位置的python,它是3.6.1版本。
PIP安装模块路径
$ pip show –files pillow 得到位置: /usr/local/lib/python2.7/site-packages
指定模块安装路径
pip install –target=d:\somewhere\other\than\the\default package_name
IDLE中加入模块路径
方法1、修改/Applications/Python\ 2.7/IDLE.app/Contents/Resources/中的idlemain.py文件
在os.chdir(os.path.expanduser(‘~/Documents’)) 这一行下面添加 sys.path.append(“/Users/*****(用户具体名字)/anaconda/lib/python2.7/site-packages”)
方法2、修改PYTHONPATH
延展阅读: