Python 3.6 Googleads TypeError:不能在类似字节的对象上使用字符串模式

Posted

技术标签:

【中文标题】Python 3.6 Googleads TypeError:不能在类似字节的对象上使用字符串模式【英文标题】:Python 3.6 Googleads TypeError: cannot use a string pattern on a bytes-like object 【发布时间】:2018-02-28 13:09:46 【问题描述】:

我尝试使用 Python 3.6 与 Google Adwords API 建立连接。我设法安装了这些库,得到了 developer tokenclient_customer_iduser_agentclient_idclient_secret 并成功请求了 refresh_token

我的 googleads.yaml 文件如下所示:

adwords:
  developer_token: hta...
  client_customer_id: 235-...-....
  user_agent: mycompany
  client_id: 25785...apps.googleusercontent.com
  client_secret: J9Da...
  refresh_token: 1/ckhGH6...

在运行第一个 python 脚本 get_campaigns.py 时,我在 ...\Anaconda3\lib\site-packages\googleads-10.0.0-py3.6.egg\googleads\util.py", line 302, in filter 中得到了非常通用的响应 TypeError: cannot use a string pattern on a bytes-like object

traffic_estimator_service.get(selector) 等其他函数会产生相同的错误。此外,在启动 Python 脚本 get_campaigns.py 时,我收到以下警告,这可能解释了一些问题:

WARNING:googleads.common:Your default encoding, cp1252, is not UTF-8. Please run this script with UTF-8 encoding to avoid errors.
INFO:oauth2client.client:Refreshing access_token
INFO:googleads.common:Request summary - 'methodName': get, 'clientCustomerId': xxx-xxx-xxxx

我尝试了很多东西,但仍然找不到导致我的错误的原因。我的设置似乎是正确的,我使用了here 提供的示例。非常感谢您的帮助!

【问题讨论】:

使用Python2.7暂时可以解决这个错误。 我在 Python 3.5 和 GoogleAds 模块的最新更新中遇到了同样的错误。奇怪的是,这曾经奏效!而且切换到 Python 2.7 并不是一个真正的选择,因为整个代码库都是 Python 3(并且过去可以正常工作) Google 在 2to3 中做错了什么。我非常忙,但您可以尝试编辑 Google 提供的 lib 代码,它可能需要一些小修复。也就是说,它不允许对二进制字符串执行正则表达式。您可以在错误日志中找到该文件, @Abe 我为 python 3 解决了这个问题。请参阅我对这个问题的编辑答案。 【参考方案1】:

目前有两种解决方案:

一个: 使用Python2.7,为我解决了这个错误。

两个: 对于python 3

def method_waraper(self, record):
    def filter(self, record):
        if record.args:
            arg = record.args[0]
            if isinstance(arg, suds.transport.Request):
                new_arg = suds.transport.Request(arg.url)
                sanitized_headers = arg.headers.copy()
                if self._AUTHORIZATION_HEADER in sanitized_headers:
                    sanitized_headers[self._AUTHORIZATION_HEADER] = self._REDACTED
                new_arg.headers = sanitized_headers
                msg = arg.message
                if sys.version_info.major < 3:
                    msg = msg.decode('utf-8')
                new_arg.message = self._DEVELOPER_TOKEN_SUB.sub(
                    self._REDACTED, str(msg, encoding='utf-8'))
                record.args = (new_arg,)
    return filter(self, record)
googleads.util._SudsTransportFilter.filter = method_waraper

这个方案修改了google提供的代码,为二进制字符串添加了utf编码,解决了我们的问题。

【讨论】:

以上是关于Python 3.6 Googleads TypeError:不能在类似字节的对象上使用字符串模式的主要内容,如果未能解决你的问题,请参考以下文章

Python 3.6 TypeEror: iter() returned non-iterator of type

将 python 2 代码更新为 googleads api 的 python 3 代码

在 Python 3.6 中使用列表定义自定义类型提示

为 Python 3.6 元类提供 __classcell__ 示例

如何使 googleads 库与 Google Ads API v2 弃用保持一致?

GoogleAds 转化 - 多个网络请求 - 有啥用?