【问题描述】
为什么使用pip安装后的库,在PyCharm导入的时候还是会报 ModuleNotFoundError: No module named 'xxx'
简单粗暴的解决方法就是在当前项目的Terminal窗口中重新pip安装一次,或者在Setting中修改当前项目的Interpreter。
在此处,还是总结一下为什么会出现这种问题,以及如何选择更合适自己的解决方法。
Python是一门解释型语言,不需要编译和链接,代码在运行时通过解释器来翻译成机器语言执行。
在Windows系统中,从cmd窗口输入python(已配置环境变量),运行python.exe,和在PyCharm中打开Python Console,这三个操作本质都是运行了一个可执行程序python.exe,即Python的解释器。
解释器运行的时候有点像 Unix 命令行:在一个标准输入 tty 设备上调用,它能交互式地读取和执行命令;调用时提供文件名参数,或者有个文件重定向到标准输入的话,它就会读取和执行文件中的脚本。 (来自Python官方文档:https://docs.python.org/zh-cn/3/tutorial/interpreter.html )
即,Python的解释器有两种运行模式,交互模式,和脚本执行模式。
当解释器运行在交互模式下时(如上图所示),我们可以在解释器中方便地运行一些代码和计算,不需要写一个完整的.py文件
当解释器运行在脚本执行模式时,需要在启动解释器时指定脚本的路径和文件名,即
python xxx.py
此时解释器会运行该文件的__main__函数。
补充:__main__是程序的主入口,当该文件中不存在__main__函数时,Python只会运行代码格式检查,不会执行代码的任意函数
Python应用程序通常会使用不在标准库内的软件包和模块。应用程序有时需要特定版本的库,因为应用程序可能需要修复特定的错误,或者可以使用库的过时版本的接口编写应用程序。
这意味着一个Python安装可能无法满足每个应用程序的要求。如果应用程序A需要特定模块的1.0版本但应用程序B需要2.0版本,则需求存在冲突,安装版本1.0或2.0将导致某一个应用程序无法运行。(来自Python官方文档:https://docs.python.org/zh-cn/3/tutorial/venv.html )
就是说,同一台开发机上可能会有多个Python项目,基于版本不同的软件包(第三方库)开发,为了避免出现版本冲突,让这些项目可以正常运行,Python使用了virtual environment作为解决方案,即:
创建一个虚拟环境,将Python解释器、标准库加入这个虚拟环境,在虚拟环境中安装其他软件包。
使用虚拟环境的优点在于:
1、系统中可以共存python2、python3版本,根据具体项目选择合适的版本
2、缩减包的数量,避免引入一些本项目中无关的包
3、同一个包,可以在不同项目中使用不同版本,不会产生冲突
但也会引入一些问题,比如:
1、增加操作复杂度,对初学者不友好,会引发本文开篇的疑问
2、可能会在每个虚拟环境中重复引用一些相同的包,占用本地空间
权衡一下优劣,还是更推荐使用虚拟环境开发的方式,另外,合理使用PyCharm可以简化很多操作。
在Windows系统中,一般会把Python环境变量配置为Python默认安装目录,即:在命令行启动python/调用pip的时候,会启动安装目录下的python.exe。
如果通过pip安装的库与项目运行环境不是同一个解释器,就会出现该问题。
即:安装在系统目录,在当前项目的虚拟环境执行;或安装在当前虚拟环境,在系统目录或其他虚拟环境中使用。
根据Python官方文档,用命令行配置虚拟环境操作相对复杂,推荐直接使用PyCharm创建和管理虚拟环境
PyCharm在新建项目时,一些版本默认推荐的是随项目创建一个新的虚拟环境
或可以在选择解释器的时候Create VirtualEnv
配置虚拟环境的名称和路径,选择Base interpreter(Python2或Python3)
PyCharm中默认虚拟环境仅在当前项目中可用,如果有多个项目使用了相同的包,可以将虚拟环境配置为其他项目可见,勾选Make available to all projects。
点击OK,虚拟环境会创建在本地路径下
这个虚拟环境的解释器在 /Scripts/python.exe
完成创建虚拟环境后,就可以指定本项目使用哪个虚拟环境
在PyCharm中,Terminal窗口看到的路径如果前面有括号,说明当前解释器用的是虚拟环境中的,具体的虚拟环境名就是括号中的内容
打开Python Console,会显示当前虚拟环境的解释器地址
在PyCharm中run当前文件,也可以看到实际上PyCharm会调用虚拟环境里的python.exe执行
打开Settings,查看Project Interpreter,可以看到当前虚拟环境中有哪些包
在下来菜单中可以选择修改当前项目的解释器,使用其他虚拟环境或系统默认环境
在设置中修改解释器
修改后重新打开Terminal、Python Console、Run,可以看到项目使用的解释器都发生了变化
Python包管理中,一种常见的做法是将本package引用的所有包,导出到一个requirements.txt文件,在新项目中使用本package时,可以通过pip requirements.txt一次性安装所有需要的包。
具体操作如下:
在Terminal中执行导出
pip freeze > requirements.txt
在新项目Terminal中执行导入
pip install -r requirements.txt