我正在使用以下命令在后台运行Python脚本:
nohup ./cmd.py > cmd.log &
但是似乎nohup没有将任何内容写入日志文件。cmd.log文件已创建,但始终为空。在Python脚本中,我使用sys.stdout.write
而不是print
将输出打印到标准输出。我做错了什么吗?
您可以使用-u
标志运行Python以避免输出缓冲:
nohup python -u ./cmd.py > cmd.log &
看起来你需要定期刷新stdout(例如sys.stdout.flush()
)。在我的测试中,即使使用print
,Python也不会自动执行此操作,直到程序退出。
python -u
无法正常工作,那么nohup
可能会引入自己的缓冲。 - jfs使用nohup
和-u
一起使用对我有用。使用-u
将强制stdout
、stderr
流无缓冲区。它不会影响标准输入。所有内容都将保存在 "nohup.out " 文件中。像这样-
nohup python -u your_code.py &
您还可以将其保存到您的目录中。这样-nohup python -u your_code.py > your_directory/nohup.out &
此外,您可以使用PYTHONUNBUFFERED
。 如果将其设置为非空字符串,则与-u
选项相同。 要使用它,请在运行Python代码之前运行以下命令。
export PYTHONUNBUFFERED=1
或者export PYTHONUNBUFFERED=TRUE
P.S.- 我建议使用cron-job这样的工具在后台运行和定期执行任务。
export PYTHONUNBUFFERED=1
nohup ./cmd.py > cmd.log &
或者nohup python -u ./cmd.py > cmd.log &
Python 3.3及以上版本的print函数有一个flush参数,这是我使用过唯一可行的方法。
print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)
我遇到了类似的问题,但与Python进程无关。我正在运行一个脚本,该脚本通过cron定期运行,并执行nohup。
我通过以下方式解决了这个问题:
PS:我的脚本是在RHEL上运行的ksh编写的。
我以以下方式运行我的脚本,一点问题都没有:
nohup python my_script.py &> my_script.out &
根据您的语法,看起来您只是在输入后面缺少了一个"&"符号...
nohup
?BSD 版本会将输出写入到当前目录下的一个名为nohup.out
的文件中(如果当前目录不可写,则写入到$HOME/nohup.out
文件中)。我没有看到可以更改输出文件名的方法... - wulong