使用python -i执行脚本后导入scipy.signal触发脚本重跑的原因及解决方法
问题分析与解决:
python -i交互模式导入模块触发脚本重跑 我之前也踩过类似的坑,你这种情况大概率是下面几个常见原因导致的,咱们一步步拆解:
可能的原因
- 脚本文件名和标准库模块撞名了:比如你的脚本叫
signal.py或者scipy.py。Python导入模块时会优先查找当前目录的文件,当你输入from scipy import signal,它会先去读你自己写的同名脚本,而不是系统自带的scipy库。如果你的这个同名脚本里有逻辑会触发自身重新执行,自然就会从头跑一遍脚本。 - 脚本里有个叫
signal的全局对象:比如你在脚本里定义了signal变量、函数或者类,当你导入scipy.signal时,这个操作会覆盖掉你原来的signal对象。如果脚本里有代码依赖这个原signal对象,甚至写了和它相关的自动执行逻辑,就可能触发脚本重跑。 - 脚本里藏着重复执行自身的代码:比如你写了
exec(open(__file__).read())这种代码,而且没放在if __name__ == "__main__":块里。当导入scipy.signal时,可能间接触发了这段代码,导致脚本被重新执行。
对应的解决办法
先查文件名!
赶紧看看你的脚本叫啥,如果是signal.py或者scipy.py,立刻改成更独特的名字,比如my_signal_test.py。别忘了删掉当前目录下的__pycache__文件夹,避免缓存的旧模块搞事情。
改掉同名的标识符
打开脚本搜一下signal,看看是不是自己定义了同名的变量、函数或者类,把它们改成更独特的名字,比如my_custom_signal,这样导入scipy的signal时就不会覆盖原有对象了。
把执行代码放进__main__块
脚本里所有顶级作用域(也就是不在函数里的代码),尽量都移到if __name__ == "__main__":这个块里。这样只有当你直接运行脚本时,这些代码才会执行;导入模块(包括不小心导入自己的脚本)时,这些代码不会触发。比如:
# 原来的顶级代码(容易触发意外执行) print("脚本运行中...") # 修改后(仅直接运行脚本时执行) if __name__ == "__main__": print("脚本运行中...")
如果是写了exec(open(__file__).read())这种测试用的代码,一定要把它放进这个块里,不然很容易触发重复执行。
内容的提问来源于stack exchange,提问作者sghys
相关产品推荐
相关产品推荐

