2012-10-06 38 views
2

任务是从python脚本执行bash脚本,并让它在后台执行,即使python脚本完成。我需要UNIX解决方案,我不在乎它是否不适用于Win。python:os.spawn。无法在后台启动bash进程

Python脚本:

#!/usr/bin/env python 
import os, commands 
command = '/usr/bin/ssh localhost "/home/gd/test/python/back.sh " ' 
print os.spawnlp(os.P_NOWAIT,command) 
print "Python done" 

/home/gd/test/python/back.sh:

#!/usr/bin/bash 

/bin/echo "started" 
/bin/sleep 80 
/bin/echo "ended" 

的问题是,Python脚本开始时,我看到印刷衍生的进程的PID 。但是背景上没有过程。当我使用P_WAIT时,我看到退出代码127,这意味着在路径中找不到命令。但是我已经提供了所有可能的路径? 这些脚本与commands.getouput完美配合。

回答

4

像这样的东西应该工作

#!/usr/bin/env python 
import os 
command = ['/usr/bin/ssh', 'ssh', 'localhost', '/home/gd/test/python/back.sh'] 
print os.spawnlp(os.P_NOWAIT, *command) 
print "Python done" 

请注意,这是最好在这里使用subprocess模块,而不是产卵

#!/usr/bin/env python 
from subprocess import Popen 
command = ['/usr/bin/ssh', 'localhost', '/home/gd/test/python/back.sh'] 
print Popen(command) 
print "Python done" 
+0

非常感谢gnibbler。我有两个问题:1.将产生*或popen结合所有命令提供给一个单一的?因为它可以被执行为“ssh; localhost; back.sh;”而不是“ssh localhost back.sh”。 2. Popen会产生一种从父母身上无法分离的过程吗?即如果家长会完成,孩子会继续跑步直到其逻辑结束? –

+0

同时测试。 Spawnlp无法按预期工作。它执行“ssh; localhost; back.sh”。因此,它与localhost - 命令未找到失败。 Popen按照gnibbler的说法工作。 –

+0

@Daniel,确保你没有错过spawn命令 –