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