【问题标题】:Make Python wait for commands to end让 Python 等待命令结束
【发布时间】:2016-03-02 03:40:32
【问题描述】:

我有一个 python 程序,它可以将文件动态移动和重命名到 hadoop 集群中。这些文件的大小通常从 10mb(已解析)到 1.5gb(原始数据)不等。要完成移动命令,可能需要一段时间,据我所知,python 会通过它们进行比赛,并且没有任何移动命令可以完成。让python等待先前命令的正确方法是什么。我将命令存储在一个变量中并将其传递给 os.system。相关代码是

os.system(moverawfile)
os.system(renamerawfile)
os.system(moveparsedfile)
os.system(renameparsedfile)

我知道重命名命令基本上是瞬间完成的。我不应该使用 os.system 吗?我如何确保 python 在移动到下一个命令之前将等待每个命令完成。

【问题讨论】:

  • 您的确切代码是什么? os.system 在它生成的命令退出之前不会返回。
  • 无论如何你都应该使用subprocess。例如,您可以在命令错误时引发异常。
  • os.system 只是调用system(3),然后等待命令完成。
  • hadoop fs -put rawjsondata.txt /home/hadoop/project/March/raw/rawjsondata.txt 这就是“moverawfile”的全部

标签: python os.system


【解决方案1】:

我建议您按照 Python 文档使用从子进程运行。它在返回之前等待您的命令完成。

【讨论】:

  • subprocess 中的某些方法等待——其他方法则不需要。 . .
  • 子进程的正确语法是什么?
  • os.system 已经在等待;如果它的行为与 os.system 异步,subprocess 将无法解决这个问题(尽管总的来说这是一个好主意)。
  • @Sam:对于your example command,您可以执行subprocess.check_call(['hadoop', 'fs', '-put', localfilepath, remotefilepath]) 之类的操作(我假设文件路径在某处的变量中)。如果您不希望它引发异常,请使用纯 subprocess.call
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 2014-12-26
相关资源
最近更新 更多