我需要从Python脚本中调出一个bash脚本。
import subprocess
subprocess.call("path/to/script.sh")
这是有效的,但脚本正在启动另一个程序,因此不会退出。所以我的主循环被子进程阻止。
有没有办法将脚本调用为线程,而不是Python中的子进程?
答案 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()
。