gpt4 book ai didi

python - 在执行之前将所有从 python 脚本触发的 shell 命令打印到控制台

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:27 24 4
gpt4 key购买 nike

我有一个中等大小的 python 脚本,它从自身内部执行大量 shell 命令。我想在执行之前将所有这些命令打印到屏幕上,以便我可以跟踪 python 脚本的控制流。

现在,脚本使用多个命令来实际执行 shell 命令,包括来自 os 模块的 system() 和来自 subprocess 模块的 call()、popen() 和 check_output()。最简单的方法是什么?

我在考虑一个包装函数,它在执行它之前打印 shell 命令参数,但我不知道如何编写一个通用函数来根据用户的判断调用正确的 call/Popen 或其他命令。我们还必须记住,这些调用采用不同数量和类型的参数。

谢谢!

最佳答案

构建并安装 decorator对于您希望拦截的各种调用。因为即使是“内置”函数也是一流的对象,您可以用日志版本替换它们:

import os

def log_wrap(f):
def logging_wrapper(*args, **kwargs):
print("Calling {} with args: {!r}, kwargs: {!r}".format(f.__name__, args, kwargs))
return f(*args, **kwargs)

return logging_wrapper

os.system("echo 'Hello, world!'")
os.system = log_wrap(os.system)
os.system("echo 'How do you like me now?!'")

此代码在运行时 (python3) 打印:

$ python test.py
Hello, world!
Calling system with args: ("echo 'How do you like me now?!'",), kwargs: {}
How do you like me now?!

请注意,在对 os.system 的第一次和第二次调用之间,我将 os.system 函数替换为在将参数传递给之前打印日志消息的函数原来的功能。您可以将日志消息打印到文件中,或(更好)调用 logging 模块,或调用 pdb 调试器,或任何您喜欢的...

关于python - 在执行之前将所有从 python 脚本触发的 shell 命令打印到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43358467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com