【发布时间】: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()没有正确等待,那么您还有另一层相同的问题,实际问题在这些其他脚本中。