module 'jsonpath' has no attribute 'jsonpath'

关键词:httprunner、jsonpath

背景:python3.7.9 + httprunner2.5.7,运行httprunner测试脚本报错。
module 'jsonpath' has no attribute 'jsonpath',没有自己写过jsonpath.py的同名文件。


3.png

问题解决步骤:
1、pip3 list查看有jsonpath module

2、修改httprunner框架的response.py文件

  • self.parsed_body() --> self.json
  • raise exceptions.ExtractFailure --> logger.log_error
def _extract_field_with_jsonpath(self, field):
    """
    JSONPath Docs: https://goessner.net/articles/JsonPath/
    For example, response body like below:
    {
        "code": 200,
        "data": {
            "items": [{
                    "id": 1,
                    "name": "Bob"
                },
                {
                    "id": 2,
                    "name": "James"
                }
            ]
        },
        "message": "success"
    }
 
    :param field:  Jsonpath expression, e.g. 1)$.code   2) $..items.*.i
    :return:       A list that extracted from json repsonse example.  
    """
    #result = jsonpath.jsonpath(self.parsed_body(), field)
    result = jsonpath.jsonpath(self.json, field)
    if result:
        return result
    else:
        #raise exceptions.ExtractFailure("\tjsonpath {} get nothing\n".
        logger.log_error("\tjsonpath {} get nothing\n".format(field))

3、再次运行httprunner的测试脚本,忧伤并没有好一些。
4、再次查看报错「module 'jsonpath' has no attribute 'jsonpath'」,再加度娘指点,于是先确定下调用的jsonpath是哪个。

xxxxdeMacBook-Pro:~ xxxx$ python -c "import jsonpath; print(jsonpath.__file__)"
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/jsonpath.py

5、知道是调用这个jsonpath.py后,立马查看这个文件,发现有jsonpath属性的。
6、那么,会不会是在调用这个属性的时候失败了呢?于是乎,copy了一个脚本进行调试。

d={
        "error_code": 0,
        "stu_info": [
                {
                        "id": 2059,
                        "name": "小白",
                        "sex": "男",
                        "age": 28,
                        "addr": "河南省济源市北海大道32号",
                        "grade": "天蝎座",
                        "phone": "18378309272",
                        "gold": 10896,
                        "info":{
                            "card":434345432,
                            "bank_name":'中国银行'
                        }
 
                },
                {
                        "id": 2067,
                        "name": "小黑",
                        "sex": "男",
                        "age": 28,
                        "addr": "河南省济源市北海大道32号",
                        "grade": "天蝎座",
                        "phone": "12345678915",
                        "gold": 100
                }
        ]
}
 
res= d["stu_info"][1]['name'] #取某个学生姓名的原始方法:通过查找字典中的key以及list方法中的下标索引
print(res) #输出结果是:小黑
 
import jsonpath
 
res1=jsonpath.jsonpath(d,'$..name') #嵌套n层也能取到所有学生姓名信息,$表示最外层的{},..表示模糊匹配
print(res1) #输出结果是list:['小白', '小黑']
 
res2= jsonpath.jsonpath(d,'$..bank_name')
print(res2) #输出结果是list:['中国银行']
 
res3=jsonpath.jsonpath(d,'$..name123') #当传入不存在的key(name)时,返回False
print(res3) #输出结果是:False

运行结果如下

这下子忧伤是辣么多又辣么大.....
7、不过没关心,可能是版本或依赖包的版本不对导致。再于是乎,和同事对了下python、httprunner以及pip3 list,都是一样的.
8、心拔凉拔凉的,算了,重装下环境吧。噼里啪啦重装了python和httprunner的环境,重启电脑,脚本一运行,嗯,忧伤加倍。
9、和同事请教,同事提出,会不会有重名模块?于是乎


发现有4个jsonpath.py文件。
10、于是把 xxx/site-packages/jsonpath_rw/jsonpath.py重命名为jsonpath-1.py,运行脚本,报错

看来不是这个。于是再把jsonpath-1.py改回jsonpath.py。
11、再把xxx/site-packages/jsonpath_rw/bin/jsonpath.py重命名为jsonpath-1.py。运行脚本,还是报错「module 'jsonpath' has no attribute 'jsonpath'」
12、再次尝试,把/Library/Frameworks/Python.framework/Versions/3.7/bin/jsonpath.py 重命名为 jsonpath-1.py。运行脚本,成功了。


上述是整个问题排查过程,简单梳理下思路就是:
1、错误信息「module 'jsonpath' has no attribute 'jsonpath'」,说明jsonpath模块有安装,但是没有jsonpath模块没有jsonpath属性,所以,有点怀疑是不是jsonpath模块安装有问题,故重新安装。
2、其次应该就是考虑模块重名的问题。但是因为在步骤4查看了jsonpath的调用,于是走入了弯路。

其实没搞明白/Library/Frameworks/Python.framework/Versions/3.7/bin/jsonpath.py是怎么来的?看了下这个文件的内容,确实不对


#!/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7
# EASY-INSTALL-ENTRY-SCRIPT: 'jsonpath-rw==1.4.0','console_scripts','jsonpath.py'
__requires__ = 'jsonpath-rw==1.4.0'
import re
import sys
from pkg_resources import load_entry_point
 
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(
        load_entry_point('jsonpath-rw==1.4.0', 'console_scripts', 'jsonpath.py')()
    )

一直以为调用的是/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/jsonpath.py,没想到实际调用了/Library/Frameworks/Python.framework/Versions/3.7/bin/jsonpath.py。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容