You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jupyter Notebook导入utils.py后多次执行无Bash输出的解决方法

问题原因

Python的模块导入机制会对已加载的模块进行缓存:第一次执行import utils时,Python会加载并执行utils.py中的所有顶层代码(包括最后调用run_bash_commands的语句),因此能看到输出;但后续再次执行import utils时,Python发现模块已经存在于sys.modules缓存中,会直接引用已加载的模块,不会重新执行模块内的代码,所以没有输出。

解决方案

以下是两种可行的实现方式:

方式一:强制重新加载模块

在Jupyter Notebook的单元格中,使用importlib.reload()强制刷新模块,每次执行单元格都会重新加载utils.py并执行其中的顶层代码:

import importlib
import utils
importlib.reload(utils)

方式二:修改utils.py结构,主动调用函数

调整utils.py的代码,将示例执行逻辑放到if __name__ == "__main__":块中(避免导入时自动执行),然后在Notebook中每次主动调用函数:

修改后的utils.py

import subprocess

def run_bash_commands(commands):
    for command in commands:
        try:
            output = subprocess.check_output(command, shell=True)
            print(output.decode('utf-8'))  # Print the output
        except subprocess.CalledProcessError as e:
            print(f"Error executing {command}: {e}")

# Example list of commands
bash_commands = [
    'echo Hello',
    'ls -l',
]

# 仅在直接运行utils.py时自动执行,导入时不执行
if __name__ == "__main__":
    run_bash_commands(bash_commands)

Notebook单元格代码

每次执行以下代码即可触发输出:

import utils
utils.run_bash_commands(utils.bash_commands)

内容的提问来源于stack exchange,提问作者mCs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:00:29