V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zzzain46
V2EX  ›  Python

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

  •  
  •   zzzain46 · 2020-02-19 21:58:03 +08:00 · 3093 次点击
    这是一个创建于 1750 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码:

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

    希望有老哥指点一下小弟

    16 条回复    2020-02-20 14:51:36 +08:00
    crella
        1
    crella  
       2020-02-19 22:19:34 +08:00 via Android
    你的 ncovkiller.py 的编码是 gbk ?改为 utf-8。报错就是指这个。实在不行的话就把 ncovkiller.py 里面的中文全删了。

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

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

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

    import codecs

    with codecs.open('nCov-killer.py', 'r', 'utf-8') as f
    zzzain46
        13
    zzzain46  
    OP
       2020-02-20 11:10:31 +08:00
    @dongxiao 我曾尝试过加参数,还是会报错
    wuwukai007
        14
    wuwukai007  
       2020-02-20 12:40:27 +08:00
    @zzzain46 问题解决了吗,或者试试这个?
    execfile(filename)
    676529483
        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)
    dongxiao
        16
    dongxiao  
       2020-02-20 14:51:36 +08:00
    @zzzain46 #13 加完参数后直接调用 killer() 函数看看,不会再是这个错误了吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5842 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:35 · PVG 10:35 · LAX 18:35 · JFK 21:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.