我有一个很长的构建脚本,它混合了“真正的”Python代码和冗长的
subprocess.run()
调用,例如debootstrap
,wget
,apt-get
或build.sh
。
一切都是并行的。一个线程执行
debootstrap
,然后执行 apt-get
,而另一个线程执行 build.sh
,然后将两者连接起来,我们启动更多线程来组合结果,依此类推。每个线程都会记录到一个专用文件中。
在寻找一种通用方法来记录由这些线程之一启动的
subprocess.run()
的输出时,我得到了以下答案:https://stackoverflow.com/a/31868783/876832
在具有多个线程的Python脚本中调用
subprocess.run()
是一个错误吗?
在具有多个线程的Python脚本中调用
是一个错误吗?subprocess.run()
不。我一直这样做。
我认为您链接的答案是误导的。毕竟,您甚至不知道
subprocess.Popen()
及其外观(如 subprocess.run()
)是否使用 fork
系统调用(特别是在 Windows 上,它们当然不知道,因为那里不存在该调用)。
os.fork()
,我会在线程程序中谨慎行事(事实上,正如文档所说,从 3.12 开始,如果 Python 检测到你正在这样做,它会警告你) .
但是,在 POSIX 系统上,
subprocess.Popen()
尽可能使用 os.posix_spawn
,否则非常仔细的fork_exec
实现。
哦,顺便说一句,您链接的问题实际上使用了Python 2.7时代的低级
thread
模块,现在恰当地称为_thread
,低级线程API。那是与threading.Thread
s不同的低级野兽。