异步Python函数调用Bash执行(通过Python Popen)

时间:2016-06-20 15:12:40

标签: python multithreading bash asynchronous

我正在Python脚本中执行bash命令(下载文件)。

def execBashCmd(bash_cmd):
     process = Popen([bash_cmd], stdout=PIPE, stderr=PIPE, shell=True)

bash命令在stdout中输出一个进程(刷新),如下所示:

Downloading File - 20.66 MiB/165.31 MiB

我希望能够定期调用python函数来更新我的python代码中的某个进程(我会用正则表达式或类似的东西)。

cmd = "gsutil cp -n ...."     # A Bash command downloading a file and displaying a status in stdout while busy.
code = utils.execBashCmd(cmd)
self.setProgress(BASH_CURRENT_PROGRESS)  # This line should be asynchrone and called upon the bash command lifetime

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

  

我希望能够在常规中调用python函数   更新进展的间隔(我会用正则表达式或   在我的python代码中的某处。

任何时候你都可以打电话给e。 G。 os.read(process.stdout.fileno(), 4096)并获取bash命令的输出进度(可能是多次更新),前提是字节数足够大。如果您还没有想要阻止此呼叫,直到下一个进度输出(如果还没有),您可以使用

进行非阻塞管道
fcntl.fcntl(process.stdout, fcntl.F_SETFL, os.O_NONBLOCK)

并且做e。克。

try:
    progress = os.read(process.stdout.fileno(), 4096)
except OSError:
    # no progress data
    pass