为什么pip安装过的库,在import的时候还是报错——Python虚拟环境介绍

【问题描述】

为什么使用pip安装后的库,在PyCharm导入的时候还是会报 ModuleNotFoundError: No module named 'xxx'

简单粗暴的解决方法就是在当前项目的Terminal窗口中重新pip安装一次,或者在Setting中修改当前项目的Interpreter。

在此处,还是总结一下为什么会出现这种问题,以及如何选择更合适自己的解决方法。

【原理详解】

1、解释器(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只会运行代码格式检查,不会执行代码的任意函数

2、虚拟环境(virtual environment)

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可以简化很多操作。

3、源问题根因

在Windows系统中,一般会把Python环境变量配置为Python默认安装目录,即:在命令行启动python/调用pip的时候,会启动安装目录下的python.exe。

如果通过pip安装的库与项目运行环境不是同一个解释器,就会出现该问题。

即:安装在系统目录,在当前项目的虚拟环境执行;或安装在当前虚拟环境,在系统目录或其他虚拟环境中使用。

【PyCharm中的虚拟环境】

根据Python官方文档,用命令行配置虚拟环境操作相对复杂,推荐直接使用PyCharm创建和管理虚拟环境

1、使用虚拟环境

a.创建项目时创建新的虚拟环境

PyCharm在新建项目时,一些版本默认推荐的是随项目创建一个新的虚拟环境

或可以在选择解释器的时候Create VirtualEnv

配置虚拟环境的名称和路径,选择Base interpreter(Python2或Python3)

PyCharm中默认虚拟环境仅在当前项目中可用,如果有多个项目使用了相同的包,可以将虚拟环境配置为其他项目可见,勾选Make available to all projects。

点击OK,虚拟环境会创建在本地路径下

这个虚拟环境的解释器在 /Scripts/python.exe

完成创建虚拟环境后,就可以指定本项目使用哪个虚拟环境

b.在项目中查看当前使用的解释器

在PyCharm中,Terminal窗口看到的路径如果前面有括号,说明当前解释器用的是虚拟环境中的,具体的虚拟环境名就是括号中的内容

打开Python Console,会显示当前虚拟环境的解释器地址

在PyCharm中run当前文件,也可以看到实际上PyCharm会调用虚拟环境里的python.exe执行

c.管理虚拟环境

打开Settings,查看Project Interpreter,可以看到当前虚拟环境中有哪些包

在下来菜单中可以选择修改当前项目的解释器,使用其他虚拟环境或系统默认环境

d.在项目中使用系统默认环境

在设置中修改解释器

修改后重新打开Terminal、Python Console、Run,可以看到项目使用的解释器都发生了变化

2、使用requirements

Python包管理中,一种常见的做法是将本package引用的所有包,导出到一个requirements.txt文件,在新项目中使用本package时,可以通过pip requirements.txt一次性安装所有需要的包。

具体操作如下:

在Terminal中执行导出

pip freeze > requirements.txt

在新项目Terminal中执行导入

pip install -r requirements.txt

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容