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
相关产品推荐
相关产品推荐

