在一个Python脚本结束后运行另一个Python脚本。

3

我有一个Python脚本需要几个小时才能完成。我通常这样运行它:

python myscript.py arg1 arg2 ... argN 2> log.err > log.out &

我希望有一个shell脚本,可以运行多次相同的python脚本(使用不同的参数)。该脚本必须在第一个脚本终止后才能启动第二个python脚本,以此类推。我认为应该使用进程ID(PID),并在一些while循环中使用sleep来迭代检查。任何建议?这些脚本在远程计算机上执行,因此我必须将它们放到后台以保证在注销后仍能继续执行。

你从哪里获取参数的? - Acsisr
我手动设置它们。它们在不同运行之间是独立的。 - NCL
为什么不使用bash脚本来运行每个命令,而使用&将这些命令放在后台?您可以始终将控制脚本放在后台。 - Martijn Pieters
因为Python脚本不能同时并行运行。 - NCL
3
如果脚本没有以 & 开始,它们将会按顺序运行。 - Martijn Pieters
4个回答

5

不要将每次调用 python 放在后台运行,而是使用一个脚本逐一运行所有作业并将脚本置于后台。例如:

#!/bin/sh

python myscript.py arg1 arg2 ... argN 2> log.err > log.out
python myscript.py different_args
# etc.

将脚本设置为可执行 (chmod +x script.sh),然后在shell中运行它,例如:./script.sh &


也许您可以看一下像screen这样的工具,它可以在您注销后继续运行作业。如果您执行screen ./script.sh,然后分离 (ctrl-a-d) 并注销,您的脚本将继续运行。然后您稍后可以重新登录并使用screen -r重新附加。


Python脚本不能同时运行,它们必须按顺序一个接一个地执行。 - NCL
在我的回答中,这正是会发生的。 - Tom Fenech
在这种情况下,您应该考虑使用screen实用程序,在注销时保持活动会话,或者像@TomFenech指出的那样在后台运行整个script.sh - alexkonradi
然后只需使用 nohup ./script.sh& 运行全局脚本。Nohup 避免了在交互会话结束时杀死后台脚本。 - Serge Ballesta
@alexkonradi 我刚想建议使用 screen :) - Tom Fenech
显示剩余2条评论

1
例如,您可以使用循环(创建一个名为runner.sh的脚本,并包含以下内容:
n=0
while read -r line
do
    let n++
    echo python myscript.py $line #>log.$n.log 2>log.$n.err
done <<ARGS
a1 a2 a3 a4
b1 b2
c1 c2 c3 c4
ARGS

这将使用参数“dry run”运行您的Python脚本。
a1 a2 a3 a4
b1 b2
c1 c2 c3 c4

按顺序执行,例如当前一个结束时。

如果满意,请从该行中删除echo#

    echo python myscript.py $line #>log.$n.log 2>log.$n.err

日志文件将按顺序编号,从 1..n 开始。
为什么要在后台运行 python 脚本?您可以将上述脚本发送到后台,整个序列将在 bg 中完成。
如果您需要在注销后运行它,请使用上面的 runner.sh
chmod 755 runner.sh
nohup runner.sh
logout

或者更好的方法是使用screen实用程序,您可以注销并从另一个地方登录并重新连接会话等等...阅读man screen。请保留html标签。

0

创建一个 Bash 脚本?

python first.py
python second.py

0
如果您想让一个脚本直接在另一个脚本之后运行,只需省略末尾的&。这个&符号告诉bash将进程放在后台运行,这样您就可以并行运行多个进程(一些在后台,一些在前台)。如果您想按顺序运行它们,应该像这样每个都在前台运行:
python myscript.py argX1 argX2 ... argXN 2> logX.err > logX.out
python myscript.py argY1 argY2 ... argYN 2> logY.err > logY.out

这将使用argx参数运行脚本,然后在完成后再次使用argY参数运行相同的脚本。

如果您希望下一次执行仅在第一次运行成功后运行,则可以使用双与符号(&&),如下所示(请注意,尾随反斜杠(\)转义换行符,因此整个内容实际上是一个单独的命令):

python myscript.py argx1 argx2 ... argN 2> logx.err > logx.out && \
python myscript.py argy1 argy2 ... argN 2> logy.err > logy.out

你可以使用双“&”连接超过两个命令,但对于更长的脚本,你应该考虑在开头使用set -e,这将导致bash在第一个错误后停止执行脚本(参见http://www.davidpashley.com/articles/writing-robust-shell-scripts/#id2382181)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接