代码:
-*- coding: utf-8 -*-
import os
from apscheduler.schedulers.blocking import BlockingScheduler
def killer():
with open('nCov-killer.py','r') as f:
exec(f.read())
if __name__ == "__main__":
scheduler = BlockingScheduler()
scheduler.add_job(killer, 'interval', seconds=5)
scheduler.start()
其中 nCov-killer.py 是一个外部脚本,单独运行一切正常。但是通过此代码运行 nCov-killer.py ,报错如下:
Job "killer (trigger: interval[0:00:05], next run at: 2020-02-19 21:56:42 CST)" raised an exception Traceback (most recent call last): File "C:\ProgramData\Anaconda3\lib\site-packages\apscheduler\executors\base.py", line 125, in run_job retval = job.func(*job.args, **job.kwargs) File "c:\Users\ZhYinYi\Desktop\killer\engine.py", line 8, in killer exec(f.read()) UnicodeDecodeError: 'gbk' codec can't decode byte 0xb3 in position 232: illegal multibyte sequence
希望有老哥指点一下小弟
1
crella 2020-02-19 22:19:34 +08:00 via Android
|
2
crella 2020-02-19 22:20:51 +08:00 via Android
看看你的 ncovkiller 文件第八行有什么奇怪的中文字符
|
4
dongxiao 2020-02-19 23:47:04 +08:00 via Android
open 里加个参数 encoding="utf-8",你这用的默认是 gbk 的
|
5
ibegyourpardon 2020-02-19 23:50:24 +08:00
line 8, in killer exec(f.read()) UnicodeDecodeError: 'gbk' codec can't decode byte 0xb3 in position 232: illegal multibyte sequence
|
6
lxy42 2020-02-19 23:50:58 +08:00
原因是 Python 尝试使用 GTK 读取 UTF-8 的文件, 在 open 时指定 encoding 参数为 gtk 就可以了. 具体看这里: https://docs.python.org/3/library/functions.html#open
|
7
lxy42 2020-02-19 23:51:23 +08:00
GTK -> GBK
|
8
Tink 2020-02-19 23:57:29 +08:00 via iPhone
文本文件编码有问题,你试着在 linux 下跑一次应该可以
|
9
gou7ma7 2020-02-20 00:18:08 +08:00 via Android
老哥虽然不知道为什么你要这样做,但是你这样没有满足基本的模块化呀!
虽然看起来好像类似于黑盒的行为,但是这样风险非常大,万一你直接打开的那个 py 被改掉了或者被迭代了,整个程序就崩了。 你看能不能考虑?把需要被打开的 py 抽象出一个接口,然后去调用那个接口。 |
10
crella 2020-02-20 01:21:33 +08:00 via Android
我记起来了,rubyinstaller 在安装的时候都有个选项,默认以 utf8 编码读取外部文件。入过不选这个,那么每次 File.open 默认都是 gbk 编码,坑爹。
|
11
imn1 2020-02-20 09:32:41 +08:00
如果全部用 0x01 - 0x7f 范围内的字符,gbk 和无 bom utf8 是一样的
0xb3 说明还是有其他字符,自然 gbk 和 utf8 读取就不同了 |
12
Marsss 2020-02-20 10:55:41 +08:00
|
14
wuwukai007 2020-02-20 12:40:27 +08:00
@zzzain46 问题解决了吗,或者试试这个?
execfile(filename) |
15
676529483 2020-02-20 14:32:33 +08:00 1
1. with open('nCov-killer.py','r', encoding="utf-8") as f:
2.换成 subprocess.run('python nCov-killer.py', shell=True) |