在结束ssh会话后在后台运行python/matplotlib时出现问题

Jam*_*mie 25 python ssh background tkinter matplotlib

我必须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"
Run Code Online (Sandbox Code Playgroud)

我假设它不知道在哪里创建我想要的数字,因为我关闭了我的X11 ssh会话.如果我在脚本运行时登录,我没有看到任何数字弹出(虽然那是因为我的脚本中没有show()命令),我认为python使用tkinter来显示数字.我创建数字的方式是,

loglog()
hist(list,x)
ylabel('y')
xlabel('x')
savefig('%s_hist.ps' %source.name)
close()
Run Code Online (Sandbox Code Playgroud)

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

python scriptToRun.py << start>& logfile.log&
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题,或者我是否只需要继续使用ssh进入我的机器?

谢谢.

Mar*_*ark 23

我相信你的matplotlib后端需要X11.查看你的matplotlibrc文件以确定你的默认值(从错误中,我打赌TkAgg).要在没有X11的情况下运行,请使用Agg后端.通过将其添加到python程序,可以在matplotlibrc文件中全局设置它,也可以通过脚本在脚本中设置它:

import matplotlib
matplotlib.use('Agg')
Run Code Online (Sandbox Code Playgroud)

  • 我有一个相关的错误,这对我有用.谢谢 :) (2认同)

Vic*_*ler 11

看起来你默认以交互模式运行,所以matplotlib想先将所有内容绘制到屏幕上,当然这是不可能做到的.

试试看

ioff()
Run Code Online (Sandbox Code Playgroud)

在脚本的顶部,以及后端更改.

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

  • 这对我不起作用.我仍然得到同样的错误. (5认同)
  • 也失败了. (2认同)