【问题标题】:Proper use of os.wait()?正确使用 os.wait()?
【发布时间】:2017-12-20 01:03:23
【问题描述】:

我正在尝试通过自动化工作场所中使用的一系列脚本来解决问题。我是一个初学者,所以我很抱歉这个很可能是一个简单的问题(希望如此),我已经阅读了文献,但对我来说不太有意义。

基本上我有一个运行 python 脚本的 bash 脚本和一个需要按顺序运行的 R 脚本,当前运行的代码是 R 脚本在 python 完成之前开始,我在这里被告知我不能使用shell 等待功能,因为我的 python 脚本启动子进程,并且 shell 等待不能用于等待孙子进程。

那很好,所以提供的解决方案是让 python 和 R 脚本等待它们自己的子进程,以便当它们退出时,bash 脚本可以按顺序正确运行。不幸的是,我无法在我的 python 脚本中找出正确的命名法。

这就是我所拥有的:

cmd = "python %s/create_keyfile.py %s %s %s %s" %(input, input, input, 
input, input)    
print cmd  
os.system(cmd)

cmd = "python %s/uneak_name_plus_barcode_v2.py %s %s %s %s" %(input, 
input, input, input, input)  
print cmd  
os.system(cmd)

cmd = "python %s/run_production_mode.py  %s %s %s %s %s" %(input, input, 
input, input, input, input)  
print cmd  
os.system(cmd)

“输入”是我的代码中的实际输入,我可能无法准确分享我们正在做什么:)

所以基本上我想找出让整个脚本在退出之前等待这三个脚本的最佳方法。

【问题讨论】:

  • os.system() 已经是一个阻塞调用,这意味着它在完成之前不会返回。除非您的 python 脚本守护进程,否则父级也应该在退出之前阻止子级。如果它们确实进行了守护进程,则您必须使用 ps 或 top 检查进程。我推测问题实际上出在 BASH 脚本中,它可能在后台运行您的脚本。如果你用以下代码替换你的 python 调用,也许可以验证你的脚本是否花费了适当的时间: python -c "from time import sleep; sleep(30)" 你的 bash 脚本应该需要 90 秒。
  • 顺便说一句,请参阅 docs.python.org/2/library/… 中关于为什么 shell=True 很危险的警告——这适用于调用在父进程和父进程之间插入 shell 的子进程的所有方法它的预期孩子,意思是os.system() 面临同样的危险(并且不应该出于同样的原因使用!)。
  • ...具体来说:考虑一下您的inputs 中的一个是否包含$(rm -rf ~)——您不希望它由shell 执行,但如果它确实会发生这种情况被替换为您的 %s 占位符之一。
  • 运行新 Python 实例的 Python 本身几乎总是一种反模式。你能import你正在运行的模块并直接调用它们吗?
  • 如果os.system() 没有正确等待,那么您还有另一层相同的问题,实际问题在这些其他脚本中。

标签: python linux shell wait


【解决方案1】:

使用subprocess.check_call() 而不是os.system()

subprocess.check_call() 将阻止您的主要 Python 脚本的执行,直到函数返回一个值。

Documentation for check_call() here

应始终使用子流程模块而不是os.system() 进行子流程管理和执行。

【讨论】:

  • 一般来说这是个好建议,但os.system() 也会阻止。
  • ...也就是说,我不明白遵循这个建议将如何解决任何问题,OP 的问题可以被合理地解释为询问。
  • 你说得对,我忘了os.system() 被屏蔽了。好多年没用过了。 :) 谢谢
【解决方案2】:

感谢所有提供帮助的人,这就是让任何谷歌搜索此内容的人陷入困境的原因。我决定从导入睡眠时插入“python -c”; sleep(30)"" 到我的代码中,前两个 python 脚本按预期等待,最后一个不是(该脚本运行后计时器将立即触发),结果第三个 python 脚本也调用了另一个小 python 脚本它的末尾有一个“&”,它忽略了任何等待它的命令。只需删除它并允许所有代码按顺序运行。 ——迈克尔·贝茨

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2012-11-08
    • 2015-06-09
    • 2021-02-02
    • 2013-07-14
    相关资源
    最近更新 更多