代码:
-*- 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 PRO 文本文件编码有问题,你试着在 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. with open('nCov-killer.py','r', encoding="utf-8") as f: 2.换成 subprocess.run('python nCov-killer.py', shell=True) |