Python with sparql-client - ImportError: cannot import name 'encodestring' from 'base64'

Python with sparql-client - ImportError: cannot import name 'encodestring' from 'base64'

我是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 的弃用方法的任何地方。

如果您选择选项 2 那么 打开 sparql 模块并编辑导入语句。变化

from base64 import encodestringfrom base64 import encodebytes 并在您的代码和任何依赖于 base64 的模块中用 encodebytes 替换任何出现的 encodestring。那应该可以解决您的问题