python 使用eval报错NameError: name ‘null’ is not defined

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 使用eval报错NameError: name ‘null’ is not defined相关的知识,希望对你有一定的参考价值。

参考技术A eval()函数十分强大,它可以把list,tuple,dict和string相互转化。
项目中用到了eval,使用eval将string转化成dict。其中有一组数据在转化时报错:NameError: name ‘null’ is not defined
经过排查,发现string数据中包含‘null’,在转换时就会报上面的错误

下面介绍一下在数据转换中,json与eval的区别:

1、json.loads与eval都能将s转成python中的对象,json.loads将json中的字符串转成unicode(types.UnicodeType),eval转成了str(types.StringType)。

2、json不认单引号,json中的字符串需要用双引号包起来

pyspark:rdd.foreach(print)报错NameError

目录

报错原因

如何查看是不是这个错误

简便解决方法

彻底解决方法


报错原因

应该是pyspark低里自带一个Python2版本,可以通升级pyspark自带的python版本来解决

除了rdd.foreach(print)报错NameError还有一个表现就是:

当使用rdd.collect()时,会出现不正常的u字母

[(u'DataStructure', 5), (u'Music', 1), (u'Algorithm', 5), (u'DataBase', 5)]

如何查看是不是这个错误

在启动的时候可以看到你的python版本

上图的python版本就是python 2.7.5

简便解决方法

每次启动pyspark时,先输入一条语句(from __future__ import print_function)即可

 from __future__ import print_function

彻底解决方法

1.安装python3

参考链接:centos安装python3详细教程_知行合一-CSDN博客_centos安装python3

如果要用的3.0以上的版本需要手动安装,下载地址:https://www.python.org/ftp/python/

(1)先查看系统python的位置在哪儿

whereis python

python2.7默认安装是在 /usr/bin目录中,切换到/usr/bin/

cd /usr/bin/

查看有关python的文件的详细信息

ll python*

从下面的图中可以看出,python指向的是python2,python2指向的是python2.7,因此我们可以装个python3,然后将python指向python3,然后python2指向python2.7,那么两个版本的python就能共存了

(2)下载python3的包之前,要先安装相关的依赖包,用于下载编译python3

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make

运行了以上命令以后,就安装了编译python3所用到的相关依赖

(3)默认的centos7是没有安装pip,先添加epel扩展源

yum -y install epel-release

(4)安装pip

yum install python-pip

(5)安装wget

yum -y install wget

(6)用wget下载python3的源码包,或者自己先下载好,上传到服务器再安装,如果网络快可以直接安装

wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz

(7)编译python3源码包,解压

xz -d Python-3.6.8.tar.xz
tar -xf Python-3.6.8.tar

(8)进入解压后的目录,依次执行下面命令进行手动编译

cd Python-3.6.8

./configure prefix=/usr/local/python3

make && make install

(9)安装依赖zlib、zlib-deve

yum install zlib zlib
yum install zlib zlib-devel

(10)最后没提示出错,就代表正确安装了,在/usr/local/目录下就会有python3目录

(11)添加软链接,将原来的链接备份

mv /usr/bin/python /usr/bin/python.bak

(12)添加python3的软链接

ln -s /usr/local/bin/python3.6 /usr/bin/python

(13)测试是否安装成功

python -V

(14)更改yum配置,因为其要用到python2才能执行,否则会导致yum不能正常使用

vi /usr/bin/yum

(15)把第一行的#! /usr/bin/python 修改为如下

#! /usr/bin/python2

(16)还有一个地方也需要修改

vi /usr/libexec/urlgrabber-ext-down

(17)把第一行的#! /usr/bin/python 修改如下

#! /usr/bin/python2

(18)启动python2

python2

(19)启动python3

python

改好之后的链接

2.pyspark设置python版本

参考链接:pyspark设置python的版本_abc_321a的博客-CSDN博客_spark指定python版本

(1)修改spark-env.sh文件,在末尾添加export PYSPARK_PYTHON=/usr/local/bin/python3.6

cd /home/hadoop/softs/spark-2.4.7/conf   //spark-env.sh文件在该目录下

(2)修改spark安装包bin目录下的pyspark

cd /home/hadoop/softs/spark-2.4.7/bin
vi pyspark

修改如图两个位置,将原来的python改成python3,如下图

(3)启动pyspark可以看到python版本变了

3.执行语句测试应该就不会报错了

如有侵权,联系删除

以上是关于python 使用eval报错NameError: name ‘null’ is not defined的主要内容,如果未能解决你的问题,请参考以下文章

eval报错NameError: name 'null' is not defined

Python 运行报错NameError出现原因,怎么解决

我写了一个python程序,报错NameError: name XX is not defined 求解

pyspark:rdd.foreach(print)报错NameError

Python:导入KMeans库失败;Kmeans报错及解决方法;NameError: name ‘KMeans‘ is not defined

Python3启动django项目报错“NameError: name '_mysql' is not defined”