Python和Pycharm运行环境有关问题详解

一、第三方模块安装失败

  • 问题描述

安装CV2等模块时发生错误,提示错误代码:

Error occurred:  Non-zero exit code(2)

Proposed solution:  Try to run command from the system terminal. Make sure that you use the correct version of ‘pip’ installed for your Python interpreter……

  • 可能的缘由

Non-zero exit code(2)报错的主要问题是pip安装版本和路径问题。

  • 解决方案

方案1.降级pip(后续如果有需要,可以再升级)。

最简单的方法是,在Pycharm底部的Terminal处执行如下命令:

python -m pip install pip==20.2.4

然后再次安装即可。

方案2.升级pip(后续如果有需要,可以再升级)。

另一种方式更底层的方式是,进入本机(系统)的Python安装目录安装。步骤如下:

首先,进入Python安装路径 

C:\Users\suoluo\AppData\Local\Programs\Python\Python38

然后,按住shift键的同时,右击菜单中的“在此处打开power shell”

最后,执行以下命令即可升级到当前的最高版本:

pip install –-upgrade pip

二、第三方模块下载太慢

  • 问题描述

下载模块时,若下载速度太慢、下载失败或者提示连接不上,等等。

  • 解决方案

首先,看网络是否通畅(虽然低级,但是有可能的!);

其次,更换下载网址,从国内镜像源下载速度一般更快,可以加-i参数,如:

pip install requests -i Simple Index

或者,在Pycharm中settings-> Project interpreter-> + -> Manage Repositories中添加Simple IndexSimple Index、https://mirrors.aliyun.com/pypi/sample/等

最后,可以在命令行设置默认下载地址。如将第三方库下载网址默认为清华镜像源:

pip config set global.index-url Simple Index

可能的解决方案

在安装第三方库时,为避免本地源下载太慢,可以加 -i 参数,如:

pip install requests -i http://mirrors.aliyun.com/pypi/simple/

三、第三方模块安装后仍然导入不成功或者找不到

  • 问题描述

如题,可能是因为操作系统尚未完全更新的缘故。

  • 解决方案

方案1.重启计算机

方案2.卸载模块,再重装试试

四、在当前文件夹以管理员身份打开PowerShell

  • 问题描述

在当前文件夹,若涉及对C盘或者有些文件的操作时,可能遇到拒绝访问错误。

  • 可能的缘由

缺少管理员权限,需要获取之。

  • 解决方案

方案1. 在当前文件夹左上角,点击【文件】>【打开 Windows PowerShell】:

Python和Pycharm运行环境有关问题详解_第1张图片

 可以看到有「打开Windows PowerShell」和「以管理员身份打开 Windows PowerShell」两个选项,选择后者即可。

方式2:使用运行窗口打开带管理员权限的PowerShell

首先,Win + R -> 输入:

owerShell 命令打开Windows PowerShell

然后,输入以下PowerShell命令,回车即可转到管理员模式

Start-Process powershell -Verb runAs

方式3:从Win + X菜单中打开带管理员权限的PowerShell

按Win + X组合键,打开开始菜单的隐藏菜单(右图)Python和Pycharm运行环境有关问题详解_第2张图片

点击Windows PowerShell(管理员)即可。

五、Python调用Matlab

Python的应用越来越广泛,在深度学习、机器学习、数据挖掘等方面有很大优势,并且有强大的第三方库,这是python的最大优势。

MATLAB在科学计算方面优化的非常极致,特别是SIMULINK的模块化编程方式非常方便,在实际的应用中经常会需要SIMULINK和python之间频繁的数据交换和调用。

因此,MATLAB与Python的混合编程极有必要学习。本文以Window10环境为例。

  • python安装matlab

找到本机的Matlab根目录(如D:\matlab),进入D:\matlab\extern\engines\python目录中,用管理员权限打开Power shell,执行:

python setup.py install

这里有可能有这么几个问题:

A.软件版本兼容问题,即Python和Matlab版本不兼容。

如果python版本过高,是无法成功的调用相应的matlab版本。二者对应关系如下:

Python和Pycharm运行环境有关问题详解_第3张图片

B.32bit和64bit版本软件不一致的问题

即Python和Matlab必须都是32bit或者64bit的版本,否则也不兼容。这就涉及到一个多版本Python的调用问题。我曾经安装了32位和64位两套python解释器,通过设置windows系统的环境参数Path(详见其他总结文档)部分解决了问题,但最终是否可行还有待验证(因为时间关系,当时无奈卸载了32位的python)

C.操作系统权限问题

python setup.py install命令报错,提示权限不够,这时需要获取管理员权限。简单的解决方法详见上文:四、在当前文件夹以管理员身份打开PowerShell

D.未知缘由问题(很严重!!!)

解决上述问题后,但我在import matlab.engine时Python依然报错,类似如下:

Python和Pycharm运行环境有关问题详解_第4张图片

“ModuleNotFoundError: No module named 'matlab.engine'; 'matlab' is not a package”

解决过程:

与大多的回答一样,以下几步是必须的:

首先,在Matlab软件安装路径下,找到文件目录“./extern/engines/python”

然后,依次执行如下命令:

python setup.py build --build-base="builddir" install

python setup.py install --prefix="installdir"

python setup.py build --build-base="builddir" install --prefix="installdir"

python setup.py install --user

通过上述操作,将得到下面这些文件夹:

一般这样就可以解决。我的问题到这里也搞定了!不过,不知道原因是啥!

E.最后的挣扎!

上述操作后,若python还是不能导入matlab.engine模块,可执行如下操作:将Matlab安装目录下/…/extern/engines/python/build/lib下的Matlab文件夹拷贝到python中包的安装目录,如:/…/python38/lib/site-packages/中,应该可以解决问题。

例如,有人因若使用的是服务器,其个人账户中仍然会出现‘matlab’ is not a package报错,但是使用root账户运行import matlab.engine则不报错。参考了如下两篇文章后,猜测可能是他的个人账户python的搜索路径未包含matlab文件:

你所不知道的 【ModuleNotFoundError: No module named ''; '' is not a package】_乐学园的技术博客_51CTO博客

No module named ‘scapy.all’; ‘scapy’ is not a package 解决方法 - 付杰博客

此时,将root账户下的matlab文件夹拷贝到他个人账户的对应位置后,一般即可!

  • 使用方法

1.1、调用matlab()(默认是同步的)

默认情况下,该引擎同步调用MATLAB函数。控件只有在MATLAB函数完成时才返回Python。但是该引擎也可以异步调用函数。控件在MATLAB仍在执行该函数时立即返回Python。引擎将结果存储在Python变量中,该变量可以在函数完成后进行检查。

https://img-blog.csdnimg.cn/20190103135441798.png

1.2、异步调用matlab

(与同步调用不同于多了一行eng = future.result的代码)

https://img-blog.csdnimg.cn/20190103135508703.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1cGVjaA==,size_16,color_FFFFFF,t_70

2、调用自定义函数

调用脚本和自定义函数的过程几乎一样,也是从变量engine中去调用。但注意,需要保证你的函数或脚本就在当前的工作路径下,否则engine会因找不到文件而报错。

https://img-blog.csdnimg.cn/20190103135531949.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1cGVjaA==,size_16,color_FFFFFF,t_70

3、变量兼容性问题

使用时有时会遇到很多变量类型不正确这样的提示,因为MATLAB函数对于输入数据的类型有着比较严格的要求,比如log2对于int8类型输入就会报错。double类型是MATLAB里面用得最多的数据型,所以一般可以将python的数据转成MATLAB兼容的double类型来解决问题。举个例子,Python的list类型变量只需加上matlab.double就可以完成转换。

https://img-blog.csdnimg.cn/20190103135543678.png

4.从 MATLAB 函数返回多个输出参数

调用gcd函数,它会返回3个参数。(默认返回一个,不返回值为0)

https://img-blog.csdnimg.cn/20190103135553994.png

  • ModuleNotFoundError: No module named 'xxx'可能的解决方案
  • 问题描述及可能原因

导致"ModuleNotFoundError: No module named 'xxx'"报错的原因很多,部分如下:

  • 忘了import(一般是考别人代码导致的),解决方法略过。
  • module包没安装
  • 没有__init__.py文件
  • 已安装的第三方package包的版本不兼容
  • 自定义的包名与安装的包名相同,导致import包的时候导错了包
  • 没设置PYTHONPATH或者
  • 自建的module包所在路径不在PYTHONPATH下
  • 不恰当的使用了相对导入
  • 各种情况下的解决方案

情况1、module包没安装

使用场景:pip安装的第三方的包找不到

这个原因比较常见,解决办法就是pip install相应的包即可。如果不确定是否安装了某个包xxx,使用下面的命令查找报警的包名xxx,如果有输出结果,说明存在这个包,否则说明不存在这个包。

pip list | grep xxx

如果在pip install的过程中提示包找不到,没有这个版本的包,可能是需要加上内置源,比如想要下载公司内部的包,那肯定需要加上公司的内置源才能找到相应的包。内置源的使用方式加上-i参数即可。比如使用清华的源

pip install xxx -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/

情况2、没有__init__.py文件

使用场景:自建的module包找不到

因为python在解释包的时候会给本文件夹也就是本module下的所有文件建立一个索引放在当前路径下的__init__.py文件中,如果没有module的文件索引,我们即使import了指定的包,解释器还是找不到这个module下的文件的,因而我们一般会在每个文件夹下建一个空的__init__.py文件。如果一个文件夹下没有__init__.py文件,不会被当作一个module。

解决方案:如果这个包是你自己写的,不妨检查一下待导入的包的根目录是否存在一个__init__.py文件,没有的话建一个空的__init__.py文件即可(注意:不光要检查待导入的包根目录是否存在__init__.py文件,还需要检查当前程序所在文件夹是否存在这个文件)。如果这个包是pip install来的,那基本上可以忽略这种可能了,继续尝试下面的原因吧。

对于缺少__init__.py文件这种情况,还有一种报错形式是:ImportError: attempted relative import with no known parent package

情况3、已安装第三方module包的版本兼容性出了问题

使用场景:pip安装的第三方的包找不到

当你已经检查并确定了module已安装,import语句也有,__init__.py文件也在。这个时候或许可以怀疑一下是不是第三方包的版本与当前所用python版本不兼容。

解决方案:先卸载原来pip安装的包,然后安装一个指定版本的包。比如python3不兼容 2.0版本及以上的DBUitls包,需要安装1.x的版本才行。

pip uninstall DBUtils

pip install DBUtils==1.3

但,怎么确定这个module是否跟当前的python版本兼容呢?

很遗憾,我也不知道!这时,打起精神赶紧度娘“'找不到xxx包'”吧!

情况4、自建的包名与第三方安装的包名相同,导致import包的时候导错了包

使用场景:pip安装的第三方的包找不到、自建的module包找不到

这种情况不经常发生,但是一旦发生,非常难找到原因。由于python包管理机制和包查找优先级,会优先从当前路径下找指定的包,如果当前文件夹下存在指定的包,则不会去PYATHONPATH或者其他路径下找包。

解决方式:给自己的文件夹换个名字,自建包的命名一定要有特点,如加个后缀。

情况5、没设置PYTHONPATH环境变量

使用场景:pip安装的第三方的包找不到

解决方案:再次执行安装install这个包的命令,这时它不会再次安装,而是会提示xxx包在xx路径已经满足,而之所以找不到,是因为没有把这个路径添加到PYTHONPATH这一环境变量中。这里以DBUtils包为例:

% pip install DBUtils==1.3

Requirement already satisfied: DBUtils==1.3 in ./venv/lib/python3.9/site-packages(1.3)

复制上面的路径,然后在terminal终端执行下面这条命令,把加粗标记的路径改成你刚才复制的路径就好。这条命令即可将刚才的包路径添加到环境变量中。

export PYTHONPATH=./venv/lib/python3.9/site-packages:$PYTHONPATH

无论是否在虚拟环境中,该的解决方式都可以生效。再次执行程序,应该不会报错。

如果仍然不行,那么指定pip -V命令,查看输出结果中的"/pip"之前路径是否和刚才加入环境变量的路径一样,如果不一样,把这个路径也加入到环境变量中。

% pip -V

pip 21.1.3 from /Users/learn_python/venv/lib/python3.9/site-packages/pip (python 3.9)

其实我的pip -V输出的路径和刚才的路径是一样的,但是为了演示不一样的情况,这里假设这个路径和刚才添加的路径不一样,这里再添加一遍到环境变量。

export PYTHONPATH= /Users/learn_python/venv/lib/python3.9/site-packages:$PYTHONPATH

提示:直接在终端运行export关键字来添加环境变量的方式可以让变量立即生效,不需要source某个文件,但是这个方式只适用于当前终端,一旦当前终端关闭或在另一个终端中,则失效。如果想要长久生效,参考“Linux和Mac环境变量设置”将路径添加到环境变量文件中。

参考:pip安装包后Import的时候提示找不到的解决方案、python的第三方包默认安装位置在哪?

情况6、自建的module包所在路径不在PYTHONPATH下

适用场景:自建的包找不到

在IDE中执行python程序,编译器会自动把当前项目的根目录加入到包查找路径中,可以理解为加到PYTHONPATH下,所以直接执行是没有问题的。但是在cmd或者terminal控制台中直接使用python相关命令来执行程序,不会自动将当前项目加入到PYTHONPATH环境变量下,如果涉及到import其他文件夹下的变量就会报类似ImportError: No module named xxx这样的错误。

解决方法:使用sys.append()命令把报警包的所在文件夹路径加入到PYTHONPATH。

比如你的项目下叫做learn_python, 下面是你的项目根目录下的文件结构。

├──README.md

├──__init__.py

├──conf

│ ├── __init__.py

│ ├── offline_conf.py # 本地运行配置文件

│ └── online_conf.py # 线上运行配置文件

└──server # 启动服务文件夹

├── __init__.py

└── launch.py

你在运行launch.py时报警conf这个module找不到,这个时候就应该通过sys.append()命令把conf所在文件夹的路径(注意是conf所在文件夹的路径,不是conf的路径),也就是 learn_python的根路径添加到PYTHONPATH中,下面是实现方案的代码。

import sys logging os

# 把当前文件所在文件夹的父文件夹路径加入到PYTHONPATH

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from conf.online_conf import *

os.path.abspath(__file__)获取到的是launch.py的绝对路径;os.path.dirname(os.path.abspath(__file__))获取到的是launch.py所在文件夹的也就是server的根路径

os.path.dirname(os.path.dirname(os.path.abspath(__file__)))获取到的是server所在文件夹也就是learn_python的根路径。

至此就获取到了learn_pyhton的根路径,使用sys.append()命令把路径添加到环境变量中即可。

参考:python程序在命令行执行提示ModuleNotFoundError: No module named 'XXX' 解决方法

最后的忠告:当你排查完了以上所有情况,发现都不符合,而且在网上找了很多文章也没找到解决方案,这个时候别独自挣扎了,因为你很可能是犯了一个很低级小众的错误,继续独自排查很难找到问题所在。最好让身边的同学帮你看一下,所谓当局者迷,旁观者清,可能你看了很长时间却没关注到一些比较基础且常见的设置,这时同事或者同学往往能很快看出你的问题所在。

你可能感兴趣的:(python)