在结束SSH会话后,后台运行python/matplotlib的问题

27 投票
4 回答
19882 浏览
提问于 2025-04-15 20:25

我需要先通过VPN连接,然后再从家里用ssh登录到我的工作服务器上,想在后台运行一个Python脚本,然后退出ssh会话。我的脚本使用matplotlib生成几个直方图,只要我保持连接一切都好,但如果我退出,就会在我为脚本创建的日志文件中看到错误信息。

 File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 2058, in loglog
    ax = gca()
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 582, in gca
    ax =  gcf().gca(**kwargs)
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 276, in gcf
    return figure()
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 254, in figure
    **kwargs)
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/backends/backend_tkagg.py", line 90, in new_figure_manager
    window = Tk.Tk()
  File "/Home/eud/jmcohen/.local/lib/python2.5/lib-tk/Tkinter.py", line 1647, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display "localhost:10.0"

我猜是因为我关闭了X11的ssh会话,所以它不知道该在哪里创建我想要的图形。如果我在脚本运行时登录,我并不会看到任何图形弹出来(虽然这是因为我的脚本里没有show()这个命令),我还以为Python是用tkinter来显示图形的。我创建图形的方式是:

loglog()
hist(list,x)
ylabel('y')
xlabel('x')
savefig('%s_hist.ps' %source.name)
close()

这个脚本需要一些初始输入,所以我在后台运行它的方式是:

python scriptToRun.py << start>& logfile.log&

有没有什么办法可以解决这个问题,还是说我必须一直保持ssh连接?

谢谢。

4 个回答

2

抱歉如果这个回答听起来很傻,但如果你只是想运行一个控制台会话,使用'screen'不是就可以了吗?它可以让你分离会话等等。

25

我觉得你的matplotlib后端需要X11。你可以查看你的matplotlibrc文件,看看默认设置是什么(从错误信息来看,我猜是TkAgg)。如果想要在没有X11的情况下运行,可以使用Agg后端。你可以在matplotlibrc文件中全局设置,或者在每个脚本中添加以下内容:

import matplotlib
matplotlib.use('Agg')
12

看起来你默认是在交互模式下运行,所以matplotlib想先把所有东西都显示在屏幕上,但这显然是做不到的。

试着在你的脚本最上面加上

ioff()

同时也要修改后端设置。

参考链接:http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.ioff

撰写回答