推荐学习书目
› 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 · Feb 19, 2020 · 4134 views
    This topic created in 2458 days ago, the information mentioned may be changed or developed.

    代码:

    -*- 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 replies  •  2020-02-20 14:51:36 +08:00
    crella
    crella
    Feb 19, 2020 via Android
    1
    你的 ncovkiller.py 的编码是 gbk ?改为 utf-8。报错就是指这个。实在不行的话就把 ncovkiller.py 里面的中文全删了。

    ps.我不懂 python
    crella
    crella
    Feb 19, 2020 via Android
    2
    看看你的 ncovkiller 文件第八行有什么奇怪的中文字符
    zzzain46
    zzzain46
    OP
    Feb 19, 2020 via Android
    3
    @crella 我写的 py 文件编码都是 utf8 的
    dongxiao
    dongxiao
    Feb 19, 2020 via Android
    4
    open 里加个参数 encoding="utf-8",你这用的默认是 gbk 的
    ibegyourpardon
    ibegyourpardon
    Feb 19, 2020
    5
    line 8, in killer exec(f.read()) UnicodeDecodeError: 'gbk' codec can't decode byte 0xb3 in position 232: illegal multibyte sequence
    lxy42
    lxy42
    Feb 19, 2020
    6
    原因是 Python 尝试使用 GTK 读取 UTF-8 的文件, 在 open 时指定 encoding 参数为 gtk 就可以了. 具体看这里: https://docs.python.org/3/library/functions.html#open
    lxy42
    lxy42
    Feb 19, 2020
    7
    GTK -> GBK
    Tink
    Tink
    Feb 19, 2020 via iPhone
    8
    文本文件编码有问题,你试着在 linux 下跑一次应该可以
    gou7ma7
    gou7ma7
    Feb 20, 2020 via Android
    9
    老哥虽然不知道为什么你要这样做,但是你这样没有满足基本的模块化呀!

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

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

    import codecs

    with codecs.open('nCov-killer.py', 'r', 'utf-8') as f
    zzzain46
    zzzain46
    OP
    Feb 20, 2020
    13
    @dongxiao 我曾尝试过加参数,还是会报错
    wuwukai007
    wuwukai007
    Feb 20, 2020
    14
    @zzzain46 问题解决了吗,或者试试这个?
    execfile(filename)
    676529483
    676529483
    Feb 20, 2020❤️1
    15
    1. with open('nCov-killer.py','r', encoding="utf-8") as f:
    2.换成 subprocess.run('python nCov-killer.py', shell=True)
    dongxiao
    dongxiao
    Feb 20, 2020
    16
    @zzzain46 #13 加完参数后直接调用 killer() 函数看看,不会再是这个错误了吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4413 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 07:58 · PVG 15:58 · LAX 23:58 · JFK 02:58
    ♥ Do have faith in what you're doing.