python pyexecjs执行含有中文字符的js脚本报错

报错信息如下:

  File "C:\ProgramData\Anaconda3\lib\threading.py", line 926, in _bootstrap_inner
    self.run()
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\ProgramData\Anaconda3\lib\subprocess.py", line 1238, in _readerthread
    buffer.append(fh.read())
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbd in position 52: illegal multibyte sequence   File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_external_runtime.py", line 103, in _exec_with_pipe
    stdoutdata, stderrdata = p.communicate(input=input)
  File "C:\ProgramData\Anaconda3\lib\subprocess.py", line 939, in communicate
    stdout, stderr = self._communicate(input, endtime, timeout)
  File "C:\ProgramData\Anaconda3\lib\subprocess.py", line 1288, in _communicate
    stdout = stdout[0]
IndexError: list index out of range


使用nodejs直接执行js是没有问题,同样代码在linux上执行也没有问题。 
原因是windows的默认编码为cp396,修改subprocess.py文件的默认编码就可以解决。
 

    def __init__(self, args, bufsize=-1, executable=None,
                 stdin=None, stdout=None, stderr=None,
                 preexec_fn=None, close_fds=True,
                 shell=False, cwd=None, env=None, universal_newlines=None,
                 startupinfo=None, creationflags=0,
                 restore_signals=True, start_new_session=False,
                 pass_fds=(), *, encoding="None", errors=None, text=None):


把上面的encoding=None改为 encoding="utf-8",就可以了。

 

搜索