Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Nohup没有将日志写入输出文件_Python_Nohup - Fatal编程技术网

Python Nohup没有将日志写入输出文件

Python Nohup没有将日志写入输出文件,python,nohup,Python,Nohup,我正在使用以下命令在后台运行python脚本: nohup ./cmd.py > cmd.log & 但nohup似乎没有向日志文件写入任何内容。cmd.log已创建,但始终为空。在python脚本中,我使用sys.stdout.write而不是print来打印到标准输出。我做错了什么吗?看起来您需要定期刷新标准输出(例如,sys.stdout.flush())。在我的测试中,在程序退出之前,Python即使使用打印也不会自动执行此操作。您可以使用-u标志运行Python,以避免

我正在使用以下命令在后台运行python脚本:

nohup ./cmd.py > cmd.log &

但nohup似乎没有向日志文件写入任何内容。cmd.log已创建,但始终为空。在python脚本中,我使用
sys.stdout.write
而不是
print
来打印到标准输出。我做错了什么吗?

看起来您需要定期刷新标准输出(例如,
sys.stdout.flush()
)。在我的测试中,在程序退出之前,Python即使使用
打印也不会自动执行此操作。

您可以使用
-u
标志运行Python,以避免输出缓冲:

nohup python -u ./cmd.py > cmd.log &

  • 使用
    -u
    nohup
    对我很有效。使用
    -u
    将强制
    stdout
    stderr
    流取消缓冲。它不会影响stdin。所有内容都将保存在“nohup.out”文件中。像这样-

    nohup python-u your_code.py&
    
    您还可以将其保存到您的目录中。这样-

    nohup python-u your_code.py>u目录/nohup.out&
    
  • 此外,还可以使用
    pythonunburged
    。如果将其设置为非空字符串,则其工作方式与
    -u
    选项相同。要使用此命令,请在运行python代码之前运行以下命令

    export pythonunbuffer=1
    

    export pythonunbuffer=TRUE
    

p.S.-我建议使用诸如cron job之类的工具在后台运行,并安排执行。

Python 3.3及更高版本有一个flush参数要打印,这是唯一适合我的方法

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)

我有一个类似的问题,但与Python进程无关。我正在运行一个脚本,该脚本执行nohup,该脚本通过cron定期运行

我能够通过以下方式解决问题:

  • 重定向stdin、stdout和stderr
  • 确保通过nohup调用的脚本不会在后台运行任何其他操作

  • PS:我的脚本是用ksh编写的,运行在RHEL上

    我以以下方式运行脚本,一点问题也没有:

    nohup python my_script.py &> my_script.out &
    

    与您的语法相比,您的输入后似乎只缺少一个“&”符号…

    您使用的是哪种
    nohup
    变体?BSD版本写入当前目录中名为
    nohup.out
    的文件(或
    $HOME/nohup.out
    如果当前目录不可写)。我看不到更改输出文件名的方法…@wulong只有当stdout是终端时才可以。我还尝试了不重定向的命令,它根本没有创建nohup.out文件。我不知道它是哪一种变体,但我使用的是SunOS 5.10,如果这有帮助的话。python以及其他基于C stdio的程序在交互情况下使用行缓冲(stdout连接到tty)和重定向到文件时使用块缓冲。如果
    python-u
    不起作用
    nohup
    可能已经引入了自己的缓冲。@J.F.Sebastian截至今天,
    nohup
    不缓冲输出,
    python-u
    工作正常。(只是对人们的更新)@Pius:在不同的平台上可能会有不同的实现。顺便说一句,python3 I/O不再基于C stdio,但它具有类似的缓冲行为。@jfs stderr缓冲行为在python3.9中发生了更改,现在它始终是行缓冲的。看,这样更好!非常感谢:)@kommradHomer我想这取决于你的程序在stdout/stderr上的输出量。工作起来很有魅力。我也认为这是一个比被选为正确答案更好的答案。请您将此标记为正确,以免混淆其他人。警告:这是错误的。我不知道为什么。是吗?这应该是公认的答案。。。做了我想做的。谢谢与@vz0的答案有什么区别?@Deqing没有区别。PYTHONUNBUFFERED效果很好。
    print("number to train = " + str(num_train), flush=True)
    print("Using {} evaluation batches".format(num_evals), flush=True)
    
    nohup python my_script.py &> my_script.out &