代码运行
笔记作者: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
。