Python 定时启动另一个 Python 脚本报错

2020-02-19 21:58:03 +08:00
 zzzain46

代码:

-*- 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

希望有老哥指点一下小弟

3081 次点击
所在节点    Python
16 条回复
crella
2020-02-19 22:19:34 +08:00
你的 ncovkiller.py 的编码是 gbk ?改为 utf-8。报错就是指这个。实在不行的话就把 ncovkiller.py 里面的中文全删了。

ps.我不懂 python
crella
2020-02-19 22:20:51 +08:00
看看你的 ncovkiller 文件第八行有什么奇怪的中文字符
zzzain46
2020-02-19 22:39:42 +08:00
@crella 我写的 py 文件编码都是 utf8 的
dongxiao
2020-02-19 23:47:04 +08:00
open 里加个参数 encoding="utf-8",你这用的默认是 gbk 的
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
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
lxy42
2020-02-19 23:51:23 +08:00
GTK -> GBK
Tink
2020-02-19 23:57:29 +08:00
文本文件编码有问题,你试着在 linux 下跑一次应该可以
gou7ma7
2020-02-20 00:18:08 +08:00
老哥虽然不知道为什么你要这样做,但是你这样没有满足基本的模块化呀!

虽然看起来好像类似于黑盒的行为,但是这样风险非常大,万一你直接打开的那个 py 被改掉了或者被迭代了,整个程序就崩了。

你看能不能考虑?把需要被打开的 py 抽象出一个接口,然后去调用那个接口。
crella
2020-02-20 01:21:33 +08:00
我记起来了,rubyinstaller 在安装的时候都有个选项,默认以 utf8 编码读取外部文件。入过不选这个,那么每次 File.open 默认都是 gbk 编码,坑爹。
imn1
2020-02-20 09:32:41 +08:00
如果全部用 0x01 - 0x7f 范围内的字符,gbk 和无 bom utf8 是一样的
0xb3 说明还是有其他字符,自然 gbk 和 utf8 读取就不同了
Marsss
2020-02-20 10:55:41 +08:00
试试用 codecs 行不行

import codecs

with codecs.open('nCov-killer.py', 'r', 'utf-8') as f
zzzain46
2020-02-20 11:10:31 +08:00
@dongxiao 我曾尝试过加参数,还是会报错
wuwukai007
2020-02-20 12:40:27 +08:00
@zzzain46 问题解决了吗,或者试试这个?
execfile(filename)
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)
dongxiao
2020-02-20 14:51:36 +08:00
@zzzain46 #13 加完参数后直接调用 killer() 函数看看,不会再是这个错误了吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/645952

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX