代码运行

笔记作者:BrickLoo

运行 Python 代码

首先,注意检查命令行界面是否已经激活正确的 Python 环境。

然后,个人一般使用以下命令来运行 Python 代码:

nohup python -u main.py 2>&1 &

命令中,各部分的含义为:

  • nohup : 不挂起(no hang up)地在系统后台运行命令,使代码在退出终端后依然能正常运行;
  • python -u main.py : 使用 nohup 后代码的输出会默认显示在 nohup.out 文件中,但直接使用 python main.py 会因为 Python 自身的输出缓冲机制导致代码中的输出并不会及时地输出在 nohup.out 文件中,且使用 tqdm 等进度条工具库时会出现进度条与程序输出的顺序不正常的情况,因此需要加上 -u 禁用 Python 的输出缓冲机制,以解决上述问题;
  • 2>&1 : nohup 只会将标准输出(stdout)重定向到 nohup.out 文件中,但标准错误输出(stderr)报错信息仍然显示在终端,需要显式重定向到文件中,因此该部分是将 2 所表示的标准错误输出重定向到标准输出 1 当前所指向的目标(即 nohup.out)中,并使用 & 避免 1 被解析为文件名。需要注意的是此处四个字符作为一个整体而没有空格,以及如果需要将输出重定向到其他文件中而不是默认的 nohup.out 中,需要在命令中先写标准输出的重定向,再写这个标准错误输出重定向的部分;
  • & : 后台运行命令,使代码的运行不占据当前终端窗口,而可以继续使用当前终端运行其他命令;

检查运行状态

简单地查看是否正在运行,可以使用:

ps rx

此时,命令显示当前用户下所有正在运行的进程的 ID 和命令等信息,如果输出结果中能找到代码运行命令对应的进程,说明代码仍在正常运行。命令支持不带 - 的 BSD 风格,相比 UNIX 风格使用 - 来指定选项,少一个字符可以稍微方便一点。据 MAN 手册描述,即使在相同字母的选项下,两种风格的命令也不一定会具有相同的功能和表现,但 rx 选项似乎并没有表现出差异。

命令中,各个参数的含义为:

  • r: only running processes,这可以使得许多与我们检查目标无关的进程被过滤,精简检索内容;
  • x: processes without controlling ttys,因为后台运行代码的对应终端(TTY)通常可能已经被关闭,所以需要允许无控制终端的进程正常显示,才能在对应终端已经被关闭的情况下显示代码的进程;

不过,使用 ps rx 显示的结果中,TIME 并不是表示代码从开始运行到现在的时长,而是累计的 CPU 时间。因此,如果希望查看代码运行的时长,我们还需要通过选项 o 手动地指定要输出的内容,代码如下:

ps rxo %p%a%t

命令中通过 AIX 格式描述符指定了需要输出的内容,包括进程的 ID %p ,含参数的命令 %a ,以及代码已经运行的时长 %t