在 中bash,我可以执行以下操作:
bash
for f in subdir/*.sh; do nohup "$f" "$@" &> /dev/null & done
换句话说,它在后台运行所有*.sh脚本,并且分离,这样如果主脚本结束,后台脚本就不会终止。subdir
*.sh
subdir
现在,假设我有以下 Python 项目:
proj/ __init__.py main.py subdir/ __init__.py mod_a.py mod_b.py mod_c.py
我该如何做类似 bash 脚本的事情?但参数要以 Python 对象的形式传递?
例如:我有两个字符串a和b,一个列表l和一个字典d
a
b
l
d
mod_a.py
mod_a.main(a, b, l, d)
mod_b.py
mod_b.main(a, b, l, d)
mod_c.py
mod_c.main(a, b, l, d)
main.py
mod_a
mod_b
mod_c
在 Python 中,你可以使用 multiprocessing 或 threading 模块来实现类似于 Bash 脚本中的后台运行任务。不过,由于 Python 是单线程的,因此如果你想要并行执行多个脚本并且让它们在主脚本结束时继续执行,可以使用 multiprocessing 来实现后台执行。
multiprocessing
threading
下面是一个使用 multiprocessing 模块的示例,它能够在后台并行执行多个模块(mod_a.py, mod_b.py, mod_c.py)中的 main() 函数:
main()
import multiprocessing import importlib import sys # 加载并调用模块的函数 def run_module(module_name, a, b, l, d): # 动态加载模块 mod = importlib.import_module(f"subdir.{module_name}") # 调用模块中的 main 函数 mod.main(a, b, l, d) if __name__ == "__main__": # 假设这些是你传递给各个模块的参数 a = "example_a" b = "example_b" l = [1, 2, 3] d = {"key1": "value1", "key2": "value2"} # 使用 multiprocessing 来启动后台任务 processes = [] modules = ['mod_a', 'mod_b', 'mod_c'] # 模块列表 for module in modules: # 创建一个进程来运行模块的 main 函数 p = multiprocessing.Process(target=run_module, args=(module, a, b, l, d)) p.start() # 启动进程 processes.append(p) # 等待所有后台进程完成 for p in processes: p.join() # 等待每个进程结束
subdir/mod_a.py
def main(a, b, l, d): # 你的代码逻辑 print(f"mod_a received: a={a}, b={b}, l={l}, d={d}")
subdir/mod_b.py
def main(a, b, l, d): # 你的代码逻辑 print(f"mod_b received: a={a}, b={b}, l={l}, d={d}")
subdir/mod_c.py
def main(a, b, l, d): # 你的代码逻辑 print(f"mod_c received: a={a}, b={b}, l={l}, d={d}")
importlib.import_module
Process
join()
mod_a.main()
mod_b.main()
mod_c.main()
daemon=True
Pool