在线程中调用bash

时间:2018-03-09 10:13:00

标签: python multithreading bash

我需要从Python脚本中调出一个bash脚本。

import subprocess 
subprocess.call("path/to/script.sh")

这是有效的,但脚本正在启动另一个程序,因此不会退出。所以我的主循环被子进程阻止。

有没有办法将脚本调用为线程,而不是Python中的子进程?

3 个答案:

答案 0 :(得分:5)

最好使用Popen

  

在新流程中执行子程序。在Unix上,该类使用   os.execvp() - 执行子程序的行为。在Windows上,   该类使用Windows CreateProcess()函数。争论的论点   Popen如下

但如果你坚持使用threads,这也可能有用:

import subprocess 
import threading


def basher():
    subprocess.call("echo hello > /tmp/test.txt", shell=True)


t = threading.Thread(target=basher)
t.start()
print('started')
# doing something else
t.join()
print('finished')

答案 1 :(得分:0)

由于您特别要求提供单独的帖子,我建议您使用multiprocessing模块(documentation):

from multiprocessing import Process
import subprocess

def myTask():
    subprocess.call("path/to/script.sh")

p = Process(target=myTask)  # creates a new thread which will run the function myTask 
p.start()  # starts the thread

# the script is now running in a separate thread
# you can now continue doing what you want

如果在你的python脚本中的某个时刻(例如在退出之前)你想确保bash脚本已经完成运行,你可以调用p.join()来阻止python脚本,直到bash脚本终止。

答案 2 :(得分:0)

不要使用call;它的唯一目的是阻止命令退出。直接使用Popen

import subprocess 
p = subprocess.Popen("path/to/script.sh")

现在script.sh在Python脚本继续运行时在分叉进程中运行。当您准备好检查脚本是否已完成时,请使用p.wait()