代码运行

笔记作者:BrickLoo

运行 Python 代码

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

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

nohup python -u main.py &

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

  • nohup : 不挂起(no hang up)地在系统后台运行命令,使代码在退出终端后依然能正常运行;
  • python -u main.py : 使用 nohup 后代码的输出会默认显示在 nohup.out 文件中,但直接使用 python main.py 会因为 Python 自身的输出缓冲机制导致代码中的输出并不会及时地输出在 nohup.out 文件中,且使用 tqdm 等进度条工具库时会出现进度条与程序输出的顺序不正常的情况,因此需要加上 -u 禁用 Python 的输出缓冲机制,以解决上述问题;
  • & : 后台运行命令,使代码的运行不占据当前终端窗口,而可以继续使用当前终端运行其他命令;

关于重定向

个人通常的习惯是先将结果输出到 nohup.out 文件,再在运行结束后根据实验设置手动处理文件名或数据,这样就不用在命令中使用 2>&1 来重定向标准错误输出信息(stderr)。要验证 stderr 是否已被正确地定向到 nohup.out 文件,可以使用以下命令检查:

lsof -p <PID>

其中,FD 字段表示文件描述符,是 File Descriptor 的缩写,格式通常为“数字+模式”,而数字在取 0/1/2 时分别对应 stdin/stdout/stderr。因此,观察数字 1 和 2 所对应的条目最末尾的 NAME 字段,即可确定该命令进程的输出信息被定向到了哪一个文件。

检查运行状态

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

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