Python 3.6解决报错:'NoneType' object has no attribute 'decode'的办法

本文介绍了一种在Python中绘制图表时遇到的关于标签解码的问题,并提供了两种解决方案:一是转换字符串类型,二是针对不同Python版本进行编码设置。
for repo_dict in repo_dicts:
    names.append(repo_dict['name'])
    plot_dict={'value':repo_dict['stargazers_count'],
               'label':repo_dict['description'],
               'xlink':repo_dict['html_url'],
               }
    plot_dicts.append(plot_dict)

在运行上面代码时,出现了

'NoneType' object has no attribute 'decode'

的错误,查阅资料后发现只要将

'label':repo_dict['description']

改为:

'label': str(repo_dict['description'])

就可以解决问题了。

当然,如果在尝试上述方法后出现新的报错信息:

UnicodeEncodeError: 'ascii' codec can't encode。。。

则需要在文件头部加上如下代码(1):

import importlib  
import sys  
importlib.reload(sys) 

注:代码(1)试用与Python3.6x版本,如果是Python2.x及之间版本则可参考一下链接:

Python 解决 :NameError: name 'reload' is not defined 问题

Exception in thread Thread-1 (_readerthread): Traceback (most recent call last): File "C:\Users\dengm\AppData\Local\Programs\Python\Python312\Lib\threading.py", line 1075, in _bootstrap_inner self.run() File "C:\Users\dengm\AppData\Local\Programs\Python\Python312\Lib\threading.py", line 1012, in run self._target(*self._args, **self._kwargs) File "C:\Users\dengm\AppData\Local\Programs\Python\Python312\Lib\subprocess.py", line 1599, in _readerthread buffer.append(fh.read()) ^^^^^^^^^ UnicodeDecodeError: &#39;gbk&#39; codec can&#39;t decode byte 0xad in position 159: illegal multibyte sequence Traceback (most recent call last): File "E:\接单\逆向\cba.py", line 34, in <module> ret = js.call("a5e", resp.text.strip(&#39;"&#39;)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\package\.venv\Lib\site-packages\execjs\_abstract_runtime_context.py", line 37, in call return self._call(name, *args) ^^^^^^^^^^^^^^^^^^^^^^^ File "D:\package\.venv\Lib\site-packages\execjs\_external_runtime.py", line 92, in _call return self._eval("{identifier}.apply(this, {args})".format(identifier=identifier, args=args)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\package\.venv\Lib\site-packages\execjs\_external_runtime.py", line 78, in _eval return self.exec_(code) ^^^^^^^^^^^^^^^^ File "D:\package\.venv\Lib\site-packages\execjs\_abstract_runtime_context.py", line 18, in exec_ return self._exec_(source) ^^^^^^^^^^^^^^^^^^^ File "D:\package\.venv\Lib\site-packages\execjs\_external_runtime.py", line 88, in _exec_ return self._extract_result(output) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\package\.venv\Lib\site-packages\execjs\_external_runtime.py", line 156, in _extract_result output = output.replace("\r\n", "\n").replace("\r", "\n") ^^^^^^^^^^^^^^ AttributeError: &#39;NoneType&#39; object has no attribute &#39;replace&#39;
07-14
<think>我们有两个错误:第一个是UnicodeDecodeError,第二个是AttributeError。 首先,我们注意到错误发生在两个不同的线程中: 1. 一个线程(Thread-1)在读取文件(或子进程输出)时出现了解码错误(UnicodeDecodeError)。 2. 主线程中,在调用execjs时,对resp.text.strip(&#39;"&#39;)的结果调用js.call时,出现了AttributeError(因为resp.text.strip(&#39;"&#39;)返回了None,然后试图调用.replace方法)。 但是,根据错误堆栈,我们主要关注两个问题: 问题1:子进程读取线程中的UnicodeDecodeError(使用gbk编解码器失败)。 问题2:在execjs调用过程中,由于一个None值调用了.replace方法导致的AttributeError。 我们先分析第二个错误,因为它发生在主线程并导致程序终止。 第二个错误(AttributeError): 代码:ret = js.call("a5e", resp.text.strip(&#39;"&#39;)) 错误:AttributeError: &#39;NoneType&#39; object has no attribute &#39;replace&#39; 原因:在execjs库的内部代码中,试图对output(可能是从子进程获取的输出)调用.replace方法,但output是None。 为什么output会是None? 根据堆栈,execjs在调用外部运行时(可能是Node.js)时,从子进程读取输出,但读取过程中可能出现了问题,导致输出为None。 注意:在第一个错误(UnicodeDecodeError)中,子进程读取线程已经崩溃,这可能导致execjs获取到的输出为None。 因此,根本问题可能是子进程的输出包含无法用gbk解码的字节序列(因为系统默认编码是gbk,而子进程输出可能是其他编码,比如UTF-8)。 具体分析第一个错误: 错误发生在subprocess模块的_readerthread线程中,该线程负责读取子进程的输出(可能是标准错误或标准输出)。 它尝试用gbk编解码器去解码字节流,但在某个位置遇到了非法多字节序列(0xad)。 为什么使用gbk? 在Windows系统中,默认的编码通常是gbk(即cp936)。当我们没有指定编码时,subprocess模块会使用当前系统的默认编码(通过`locale.getpreferredencoding()`获取)来解码子进程的输出。 解决方案: 1. 明确指定子进程的编码为UTF-8(如果子进程输出是UTF-8)。 2. 或者,忽略解码错误(使用errors=&#39;ignore&#39;或&#39;replace&#39;),但这可能会丢失信息。 但是,注意这个错误发生在execjs库的内部,我们无法直接控制execjs创建子进程时的编码设置。 因此,我们需要考虑两个层面: a) 修复execjs调用时可能出现的编码问题。 b) 确保我们传递给execjs的参数是有效的(非None)。 首先,检查`resp.text`是否为None?如果是,那么`resp.text.strip(&#39;"&#39;)`就会出错(因为None没有strip方法)。但是错误堆栈显示,错误发生在execjs库内部,而不是我们的代码行直接调用strip。所以,我们先检查传递给execjs的参数。 从错误堆栈看,我们的代码行是: ret = js.call("a5e", resp.text.strip(&#39;"&#39;)) 这里,`resp.text`可能是None吗?如果是,那么`resp.text.strip(&#39;"&#39;)`就会抛出AttributeError(因为None没有strip方法)。但是错误堆栈中显示的错误发生在execjs库内部,而不是这一行。所以,我们排除了`resp.text`为None的情况(因为如果这一行出错,错误堆栈会指向这一行)。 因此,问题在于execjs库在调用外部JavaScript运行环境(如Node.js)时,子进程的输出出现了编码问题,导致读取失败,进而使得execjs获取到的输出为None,然后在后续处理(替换换行符)时出错。 所以,主要问题在于第一个错误(UnicodeDecodeError)导致了第二个错误(AttributeError)。 如何解决UnicodeDecodeError? 在execjs库中,我们无法直接设置子进程的编码。但是,我们可以尝试设置环境变量来改变默认编码,或者修改系统默认编码(不推荐)。 另一种方法是:确保子进程(Node.js)输出的编码是GBK能识别的,或者改变整个Python进程的标准输出编码。 然而,一个更简单的方法是:使用一个支持UTF-8编码的操作系统环境,或者修改代码以强制使用UTF-8编码。 但是,在Windows上,我们可以通过设置环境变量`PYTHONUTF8=1`来强制Python使用UTF-8编码(Python3.7以上支持)。或者,在代码开始处设置: 但是,注意这个错误发生在subprocess模块读取子进程输出时,我们可以通过设置`universal_newlines=False`(即使用字节流)然后手动解码来避免,但这需要修改execjs库。 由于execjs库是第三方库,我们可以考虑以下替代方案: 方案1:修改系统默认编码(不推荐,因为会影响到其他部分) 方案2:在调用execjs之前,设置环境变量,改变标准输出的编码。 我们可以尝试设置环境变量`PYTHONIOENCODING`为`utf-8`,这样Python在读取子进程时会使用UTF-8编码。 例如,在程序开始添加: import os os.environ["PYTHONIOENCODING"] = "utf-8" 但是,根据Python文档,这个环境变量只在部分情况下有效(比如标准输入输出),而对于subprocess模块不一定有效。 另一个方案:在创建子进程时指定编码,但execjs库没有提供这个接口。 因此,我们可以考虑使用execjs的其他运行时,或者使用另一个库(如node.js的官方API)来避免编码问题。 但是,我们也可以尝试修复execjs库的代码。根据错误堆栈,execjs在读取子进程输出时使用了系统默认编码(gbk),我们可以通过修改execjs的源码来指定编码。 在execjs的_external_runtime.py中,找到创建子进程的地方,指定encoding为&#39;utf-8&#39;。 具体位置:在_execute方法中,有类似这样的代码: p = subprocess.Popen(..., stdout=subprocess.PIPE, stderr=subprocess.PIPE) 我们可以修改为: p = subprocess.Popen(..., stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding=&#39;utf-8&#39;, errors=&#39;replace&#39;) 但是,由于execjs库版本不同,具体位置可能不同。另外,修改第三方库的代码不是最佳实践。 因此,我们建议的解决方案: 1. 确保传递给execjs的参数是有效的字符串(非None,且是正确编码的字符串)。 2. 尝试设置环境变量,使得子进程使用UTF-8编码输出。 但是,第二个错误(AttributeError)是由于第一个错误(UnicodeDecodeError)导致的,所以我们必须先解决第一个错误。 由于错误信息提到子进程输出中包含0xad,这个字节在GBK编码中是无效的。我们可以尝试使用UTF-8编码来读取。 在无法修改execjs源码的情况下,我们可以尝试以下方法: 方法1:设置系统环境变量,改变默认编码(临时改变) 在运行Python脚本之前,设置环境变量: set PYTHONIOENCODING=utf-8 然后运行脚本。 方法2:在代码中重新设置标准输出的编码(不一定有效,因为错误发生在子线程读取子进程输出时) 方法3:使用另一个JavaScript运行时,比如PyV8(但可能不兼容)。 方法4:尝试使用execjs的Node.js运行时,并明确指定Node.js使用UTF-8编码输出。 在Node.js中,我们可以通过设置环境变量NODE_OPTIONS来传递参数,但输出编码是受系统影响的。 方法5:捕获子进程的异常,忽略解码错误(但这样会丢失输出)。 由于时间关系,我们提供一个简单的方法:在代码开始设置环境变量,尝试改变标准流的编码。 另外,检查我们的代码中`resp.text`是否可能包含非GBK编码的字符?如果resp.text是从网络请求中获取的,那么我们应该检查其编码。 在requests库中,resp.text是根据响应头中的charset来解码的,如果没有指定,则使用chardet猜测。如果resp.text是正确解码的字符串,那么传递给execjs的应该是一个字符串,不会导致子进程输出编码问题。 因此,问题可能出在execjs调用的JavaScript代码的输出上。也就是说,JavaScript代码输出了一些非GBK编码的字符(可能是UTF-8),而Windows的默认编码是GBK,所以导致了解码失败。 所以,我们回到第一个错误:UnicodeDecodeError。 我们尝试在代码中设置子进程的编码: 由于execjs库没有提供设置编码的选项,我们可以通过猴子补丁(monkey patch)来修改subprocess的行为。 例如,在导入execjs之前,修改subprocess.Popen,使其默认使用UTF-8编码: 但是,这可能会影响其他部分,而且比较危险。 另一种思路:我们使用execjs的另一种运行时,比如使用PhantomJS(但已经过时)或者PyV8(纯Python,不需要子进程)。 但是,PyV8可能不支持最新的ES语法。 因此,我们建议: 1. 尝试使用不同的JavaScript运行时(例如,指定使用Node.js并设置环境变量NODE_OPTIONS为`--enable-utf8-encoding`?但Node.js似乎没有这个选项)。 2. 设置Node.js的环境变量,使其以UTF-8模式运行(在Windows上,可以通过设置环境变量`set NODE_OPTIONS=--experimental-utf8`,但具体选项可能随版本变化)。 然而,一个更简单的方法:在调用execjs之前,设置临时环境变量,改变当前进程的默认编码。 我们可以尝试: import os os.environ["PYTHONLEGACYWINDOWSSTDIO"] = "utf-8" (这个环境变量用于在Windows上使用UTF-8编码,但需要Python3.6以上,且有时效果不佳) 或者,尝试: import sys sys.stdin.reconfigure(encoding=&#39;utf-8&#39;) sys.stdout.reconfigure(encoding=&#39;utf-8&#39;) sys.stderr.reconfigure(encoding=&#39;utf-8&#39;) 但注意,这只能改变当前进程的标准流,对于子进程不一定有效。 因此,我们可能需要修改subprocess调用的方式,但execjs库内部已经写死。 鉴于以上,我们建议的解决方案是: 1. 修改系统区域设置,使用Unicode UTF-8(Windows 10 1903以上支持)。但这会影响整个系统,且需要用户设置。 2. 在代码中,通过猴子补丁修改subprocess.Popen,在创建子进程时指定utf-8编码。 猴子补丁示例: import subprocess from functools import partial # 保存原来的Popen original_popen = subprocess.Popen # 定义新的Popen,固定使用utf-8编码 def new_popen(*args, **kwargs): # 如果参数中没有指定encoding,则设置为&#39;utf-8&#39; if &#39;encoding&#39; not in kwargs: kwargs[&#39;encoding&#39;] = &#39;utf-8&#39; # 设置错误处理方式,比如忽略或替换 if &#39;errors&#39; not in kwargs: kwargs[&#39;errors&#39;] = &#39;replace&#39; return original_popen(*args, **kwargs) # 应用补丁 subprocess.Popen = new_popen 然后,再导入execjs。 注意:这个补丁会影响所有subprocess.Popen的调用,可能会引起其他问题。 因此,我们只希望对execjs的调用生效,可以在使用execjs之前打补丁,使用后恢复。 但是,execjs库在导入时可能已经使用了subprocess.Popen(例如在查找运行时),所以我们需要在导入execjs之前就打好补丁。 步骤: import subprocess import execjs # 保存原来的Popen original_popen = subprocess.Popen class UTF8Popen(subprocess.Popen): def __init__(self, *args, **kwargs): if &#39;encoding&#39; not in kwargs: kwargs[&#39;encoding&#39;] = &#39;utf-8&#39; if &#39;errors&#39; not in kwargs: kwargs[&#39;errors&#39;] = &#39;replace&#39; super().__init__(*args, **kwargs) subprocess.Popen = UTF8Popen # 然后使用execjs ... # 使用完后恢复(如果需要) # subprocess.Popen = original_popen 但是,由于线程问题(错误发生在子线程),我们必须在任何线程启动之前设置好。 由于错误发生在读取子进程输出的线程中,而该线程是在调用execjs时由execjs库启动的,所以我们在调用execjs之前设置好补丁即可。 示例代码: import subprocess from functools import partial # 保存原来的Popen original_popen = subprocess.Popen # 定义新的Popen def new_popen(*args, **kwargs): if &#39;stdout&#39; in kwargs or &#39;stderr&#39; in kwargs: # 如果我们要重定向stdout或stderr,并且没有指定编码,则使用utf-8 if &#39;encoding&#39; not in kwargs: kwargs[&#39;encoding&#39;] = &#39;utf-8&#39; if &#39;errors&#39; not in kwargs: kwargs[&#39;errors&#39;] = &#39;replace&#39; return original_popen(*args, **kwargs) subprocess.Popen = new_popen # 然后导入execjs import execjs 但是,这种方法可能会影响其他部分,所以请谨慎使用。 另外,我们也可以尝试使用`execjs.get().name`来查看当前使用的运行时,并尝试更换运行时。 例如,使用JScript(IE)作为运行时(但只支持Windows,且功能有限): import execjs print(execjs.get().name) # 查看当前运行时 # 如果当前是Node,我们可以尝试使用其他运行时 # 设置环境变量指定运行时:os.environ["EXECJS_RUNTIME"] = "JScript" 但是,JScript不支持Node.js的语法。 综上所述,我们提供两种解决方案: 方案一:猴子补丁subprocess.Popen(推荐在无法修改环境的情况下使用,但需注意风险) 方案二:设置环境变量,将整个系统的默认编码改为UTF-8(推荐,但需要用户配合) 由于在Windows上设置系统区域使用UTF-8的方法: 设置 -> 时间和语言 -> 语言 -> 管理语言设置 -> 更改系统区域设置 -> 勾选“使用Unicode UTF-8提供全球语言支持” 然后重启。 但是,这需要重启,并且可能影响其他程序。 因此,我们优先尝试方案一(猴子补丁)。 另外,我们还可以尝试在创建子进程时,通过设置`env`环境变量来传递UTF-8设置: new_env = os.environ.copy() new_env[&#39;PYTHONIOENCODING&#39;] = &#39;utf-8&#39; new_env[&#39;NODE_OPTIONS&#39;] = &#39;--experimental-utf8&#39; # 对于Node.js,这个选项不一定有效 # 然后在Popen中传递env=new_env 但是,execjs库没有提供传递环境变量的接口,所以我们只能通过猴子补丁来传递环境变量。 修改后的猴子补丁: import subprocess import os original_popen = subprocess.Popen def new_popen(*args, **kwargs): # 准备新的环境变量 env = kwargs.get(&#39;env&#39;, os.environ.copy()) # 设置我们需要的环境变量 env[&#39;PYTHONIOENCODING&#39;] = &#39;utf-8&#39; # 对于Node.js,设置NODE_OPTIONS env[&#39;NODE_OPTIONS&#39;] = &#39;--experimental-utf8&#39; # 注意:这个选项在较新的Node版本中可能不需要,或者无效 kwargs[&#39;env&#39;] = env # 设置编码 if &#39;encoding&#39; not in kwargs: kwargs[&#39;encoding&#39;] = &#39;utf-8&#39; if &#39;errors&#39; not in kwargs: kwargs[&#39;errors&#39;] = &#39;replace&#39; return original_popen(*args, **kwargs) subprocess.Popen = new_popen 然后导入execjs。 注意:这个补丁会修改所有子进程的环境变量,并且设置了编码和错误处理。 由于Node.js的--experimental-utf8选项可能不存在,我们可以尝试去掉,因为设置PYTHONIOENCODING和Popen的编码参数应该已经足够。 但是,PYTHONIOENCODING只影响Python子进程,对Node.js无效。而Node.js在Windows上默认输出编码是UTF-8吗?不是,它取决于控制台的编码(chcp命令)。所以,我们可以在启动Node.js时,通过设置环境变量`NODE_CHANNEL_FD`和`NODE_UTF8`?但似乎没有直接控制输出编码的环境变量。 因此,我们主要依靠在Popen中设置`encoding=&#39;utf-8&#39;`来正确解码Node.js的输出(假设Node.js输出的是UTF-8)。 综上所述,我们给出以下代码示例: import os import subprocess import sys # 猴子补丁:修复子进程的编码问题 if sys.platform.startswith(&#39;win&#39;): original_popen = subprocess.Popen def new_popen(*args, **kwargs): # 确保环境变量包含UTF-8设置 env = kwargs.get(&#39;env&#39;, os.environ.copy()) env[&#39;PYTHONIOENCODING&#39;] = &#39;utf-8&#39; kwargs[&#39;env&#39;] = env # 设置编码为UTF-8,错误处理为&#39;replace&#39; if &#39;encoding&#39; not in kwargs: kwargs[&#39;encoding&#39;] = &#39;utf-8&#39; if &#39;errors&#39; not in kwargs: kwargs[&#39;errors&#39;] = &#39;replace&#39; return original_popen(*args, **kwargs) subprocess.Popen = new_popen # 然后导入execjs import execjs # 接下来使用execjs 注意:这个补丁只对Windows有效,因为其他系统(如Linux、macOS)通常默认使用UTF-8。 但是,错误堆栈显示是Windows(路径为C:\...)。 另外,我们还需要确保在导入execjs之前打补丁,因为execjs可能在导入时就会使用subprocess.Popen。 最后,关于第二个错误(AttributeError)的补充:由于第一个错误(UnicodeDecodeError)导致子进程输出读取失败,从而使得execjs获取到的输出为None。因此,解决了第一个错误,第二个错误就不会发生了。 因此,我们专注于解决第一个错误即可。 如果上述方法仍然无效,我们还可以尝试使用其他方法调用JavaScript,比如使用Node.js的subprocess模块,并手动控制输入输出。 例如,我们可以用subprocess直接调用Node.js脚本,并指定编码: import subprocess # 将JavaScript代码保存为字符串或文件 js_code = """ function a5e(text) { // ... 函数体 } console.log(a5e(process.argv[1])); """ # 或者从文件读取 # 调用Node.js process = subprocess.Popen([&#39;node&#39;, &#39;-e&#39;, js_code, input_text], stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding=&#39;utf-8&#39;, errors=&#39;replace&#39;) stdout, stderr = process.communicate() if process.returncode != 0: raise Exception(stderr) result = stdout.strip() 这样,我们可以完全控制编码。 因此,如果execjs库的编码问题无法解决,我们可以考虑绕过execjs,直接使用subprocess与Node.js交互。 综上所述,我们提供了两种主要解决方案: 1. 猴子补丁subprocess.Popen(在Windows上强制使用UTF-8编码)。 2. 绕过execjs,直接使用subprocess调用Node.js。 请根据实际情况选择。 最后,我们回答中需要包含对错误的解释和解决方案,并提供代码示例。 由于问题复杂,我们分点解释。 注意:由于错误信息中包含了两个错误,但第二个错误是由第一个错误引起的,所以我们重点解决第一个错误。</think>### 问题分析:`UnicodeDecodeError` 和 `AttributeError` 的组合错误 #### 错误原因: 这两个错误相互关联,形成链式错误: 1. **UnicodeDecodeError** (根本原因): - 发生在子线程 `Thread-1` 中 - 当尝试用 `gbk` 编码解码字节流时,遇到非法多字节序列(0xad) - 常见场景:Windows 系统默认使用 GBK 编码,但子进程(如 Node.js)输出了 UTF-8 格式的文本 2. **AttributeError** (衍生错误): - 由于 `UnicodeDecodeError` 导致子进程输出读取失败 - 使得 `execjs` 获取到的输出变为 `None` - 后续在 `execjs._external_runtime.py` 中调用 `.replace()` 时失败 #### 关键点: ```python # execjs 库内部代码 output = output.replace("\r\n", "\n").replace("\r", "\n") # output 为 None 时崩溃 ``` --- ### 解决方案(分步实施) #### ✅ 方案 1:修复编码问题(推荐) 修改子进程编码设置,强制使用 UTF-8 解码: ```python import execjs import subprocess import os # 设置环境变量确保子进程使用 UTF-8 os.environ["NODE_OPTIONS"] = "--experimental-utf8" # Node.js 专用 os.environ["PYTHONIOENCODING"] = "utf-8" # 猴子补丁修复 subprocess original_popen = subprocess.Popen def patched_popen(*args, **kwargs): # 强制指定编码和错误处理 kwargs.setdefault("encoding", "utf-8") kwargs.setdefault("errors", "replace") # 替换非法字符 kwargs.setdefault("text", True) # Python 3.7+ return original_popen(*args, **kwargs) subprocess.Popen = patched_popen # 重新加载 execjs 使补丁生效 import importlib importlib.reload(execjs) # 现在安全调用 execjs js = execjs.compile(""" function a5e(text) { return text + " processed"; } """) ret = js.call("a5e", "input_text") print(ret) ``` #### ✅ 方案 2:直接使用 subprocess 绕过 execjs 完全避免 execjs 的编码问题: ```python import subprocess import json def node_call(func_name, arg): script = f""" function {func_name}(text) {{ /* 你的 JavaScript 函数 */ return text + " processed"; }} console.log(JSON.stringify({func_name}("{arg}"))); """ # 显式指定 UTF-8 编码 result = subprocess.run( ["node", "-e", script], capture_output=True, encoding="utf-8", errors="replace", check=True ) return json.loads(result.stdout) # 调用示例 ret = node_call("a5e", "input_text") print(ret) # 输出: "input_text processed" ``` #### ✅ 方案 3:预处理响应数据 确保输入数据有效: ```python import execjs # 原始问题代码 # ret = js.call("a5e", resp.text.strip(&#39;"&#39;)) # 修复:验证并清理输入 input_text = resp.text # 检查 None 并处理编码 if input_text is None: input_text = "" elif isinstance(input_text, bytes): input_text = input_text.decode("utf-8", errors="replace") else: input_text = input_text.strip(&#39;"&#39;) # 安全调用 ret = js.call("a5e", input_text) ``` --- ### 关键注意事项: 1. **Windows 编码问题**: - Windows 默认使用 GBK,而现代开发工具常用 UTF-8 - 解决方案:显式指定 `encoding="utf-8"` 2. **execjs 库限制**: - 内部使用 subprocess 未正确处理跨平台编码 - 推荐方案:直接使用 subprocess 控制编码 3. **错误处理层级**: ```mermaid graph LR A[Node.js 输出 UTF-8] --> B[subprocess 用 GBK 解码] B --> C[UnicodeDecodeError] C --> D[读取失败返回 None] D --> E[execjs 调用 .replace 崩溃] ``` ---
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值