要从我的Python脚本启动程序,我使用以下方法:
def execute(command):
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = process.communicate()[0]
exitCode = process.returncode
if (exitCode == 0):
return output
else:
raise ProcessException(command, exitCode, output)
Run Code Online (Sandbox Code Playgroud)
因此,当我启动一个类似的过程时Process.execute("mvn clean install"),我的程序会一直等到过程结束,然后我才能获得程序的完整输出.如果我正在运行需要一段时间才能完成的过程,这很烦人.
我可以让我的程序逐行写入进程输出,通过在循环结束之前轮询进程输出或其他内容吗?
**[编辑]抱歉,在发布此问题之前我没有很好地搜索.线程实际上是关键.在这里找到一个示例,说明如何执行此操作:** 来自线程的Python Subprocess.Popen
如何从Python脚本播放音频(它可能就像1秒声音)?
如果它与平台无关,那将是最好的,但首先它需要在Mac上运行.
我知道我可以afplay file.mp3从Python中执行命令,但是可以在原始Python中执行吗?如果它不依赖外部库我也会更好.
我一直想编写一个python脚本,它将按顺序运行几个rsync实例,以便将数据备份到另一台计算机.
目前我只有这个文本文件和我使用的命令,我只是将它们复制粘贴到终端中,看起来有点傻.
我希望能够使用python为我做这个.我非常清楚地知道如何使用subprocess.popen,但我不知道如何让python直接与rsync交互,比如输入我的密码.python能做到吗?
就像是:
if theProccess.proccessResponse == "Password:" :
theProccess.respond(string)
Run Code Online (Sandbox Code Playgroud)
或者我能做的最好的就是拥有它,甚至是bash脚本,只需按顺序运行rsyncs并且必须反复输入我的密码?
提前致谢.
我看了一下,但我似乎无法解决这个问题.我想在我的django应用程序的视图中执行python脚本.我已经在django管理命令中放置了我想要执行的代码,因此可以通过命令行访问它python manage.py command-name.然后我尝试使用运行此命令subprocess.Popen("python manage.py command-name",shell=True).
但是,此命令可能需要一些时间才能执行,因此我希望视图继续并允许脚本在后台执行.单独使用subprocess.Popen似乎会导致视图挂起,直到脚本完成,所以我尝试使用一个线程(跟随另一个 SA问题):
class SubprocessThread(threading.Thread):
def __init__(self, c):
self.command = c
self.stdout = None
self.stderr = None
threading.Thread.__init__(self)
def run(self):
p = subprocess.Popen(self.command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = p.communicate()
Run Code Online (Sandbox Code Playgroud)
然后执行它:
t = SubprocessThread("python manage.py command-name")
t.setDaemon(True)
t.start()
t.join()
Run Code Online (Sandbox Code Playgroud)
但是,视图仍然挂起:光标有一个忙符号,页面上的AJAX没有加载.否则,在线程调用看起来正常完成(脚本完成之前)后,页面的html似乎加载正常并且视图中的命令.有人可以帮帮我吗?我希望脚本能够在不阻止页面上的视图或AJAX调用的情况下执行并执行自己的操作.