具有sparql-client的Python-ImportError:无法从'base64'导入名称'encodestring'

问题描述

我是Python新手。尝试使用此模块https://pypi.org/project/sparql-client/

module.py

from sparql import Service


class MyModule:

    def my_method(self):
        s = Service('https://my-endpoint:8182/sparql',"utf-8","GET")
        statement = """
            MOVE uri:temp_graph TO uri:user_graph
            ADD uri:temp_graph TO uri:user_graph    
        """.format(user_graph="http://aws.amazon.com/account-uid",temp_graph="http://aws.amazon.com/account-uid-temp")
        s.query(statement)

我正在尝试对其进行测试

test_module.py

import unittest

from unittest.mock import patch,Mock

class TestModule(unittest.TestCase):

    @patch('sparql.Service',autospec=True)
    def test_mymethod(self,sparql_mock):
        sparql_instance = sparql_mock.return_value
        sparql_instance.query = Mock()

我跑步时得到

  File "/usr/local/Cellar/python@3.9/3.9.0_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/mock.py",line 1564,in <lambda>
    getter = lambda: _importer(target)
  File "/usr/local/Cellar/python@3.9/3.9.0_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/mock.py",line 1236,in _importer
    thing = __import__(import_path)
  File "/usr/local/lib/python3.9/site-packages/sparql.py",line 50,in <module>
    from base64 import encodestring
ImportError: cannot import name 'encodestring' from 'base64' (/usr/local/Cellar/python@3.9/3.9.0_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/base64.py)

因此它无法导入此行

https://github.com/eea/sparql-client/blob/master/sparql.py#L50

有什么解决方法吗?

解决方法

问题是由您正在运行的base64模块的版本引起的,而已安装的sparql的版本取决于较低版本的base64模块。 sparql依赖于为python3.1构建的base64版本。从那以后,encodestring()和decodestring()就被弃用了。如果必须继续使用此版本的sparql,最好的选择是将python版本从3.9(当前版本)降级到3.1。 选项2将为您已安装的当前版本的base64采用新的规范。这将意味着更新sparql以及您要调用base64弃用方法的任何地方。

如果您选择使用option2,则 打开sparql模块并编辑import语句。更改

from base64 import encodestringfrom base64 import encodebytes,然后在代码以及您依赖于base64的任何模块中,将任何出现的encodestring替换为encodebytes。那应该可以解决您的问题

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...