【问题标题】:Calling Python Command Using Subprocess inside a Loop在循环中使用子进程调用 Python 命令
【发布时间】:2021-07-13 15:08:06
【问题描述】:

以下命令不等待子进程完成执行。

mylist = ['First','Second','Third',....., 'Nth']
for items in mylist:
        subprocess.run('googleimagesdownload --keywords "'+items+'" --size medium --limit 100  --output_directory ../../../downloads')

我想在 Linux 终端中执行上面的 Python 脚本但是 它不等待子进程完成每个迭代

for items in mylist:
        os.system('googleimagesdownload --keywords "'+items+'" --size medium --limit 100  --output_directory ../../../downloads')
        

以下 Python 脚本在 Windows 上运行良好,它等待命令完全执行然后移至下一个迭代,但在 Linux 终端上不起作用

【问题讨论】:

  • subprocess.run() 调用应该等待调用完成,如果将函数调用替换为subprocess.run(['sleep', '1']),它是否有效?
  • 将以下代码放在我的下面之后,现在该过程会在 1 秒后重新运行Nothing Else。
  • 为什么要等待每个任务完成?您可以并行下载它们。如果你的问题是你的程序在它完成之前就结束了,你应该考虑使用asynciostackoverflow.com/a/63786058/277267
  • 你能用我的代码分享这个例子吗? Asyncio

标签: python linux terminal subprocess


【解决方案1】:

我认为对您来说最简单的方法是使用 subprocess.Popen()。您可以使用 then wait() 方法等待被调用命令的结束。

向您展示其工作原理的代码:

import subprocess
mylist = ['sleep 1']*3 # program will sleep for 3 seconds
for items in mylist:
        process = subprocess.Popen(items,shell = True)
        process.wait()
        print('waiting... ')
print('FINISH!')

您的代码已修改并使用 subprocess.Popen():

mylist = ['First','Second','Third',....., 'Nth']
for items in mylist:
        process = subprocess.Popen('googleimagesdownload --keywords "'+items+'" --size medium --limit 100  --output_directory ../../../downloads')
        process.wait()

【讨论】:

  • 仍然在放入修改后的代码后,程序仍然没有等待每次迭代完全执行命令并等待它结束。!
  • 我曾经使用从 google 到 GCP 的 Linux 程序。很多时候,程序开始在后台运行,在调用并按下回车键之后。无论执行上一个命令,都可以传递下一个命令。也许你的 Linux 程序正在后台运行..
  • 那为什么它在这里不起作用?还有其他解决方案吗?
猜你喜欢
  • 2021-04-11
  • 2015-01-13
  • 1970-01-01
  • 2016-10-24
  • 2014-09-04
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多