使用tkinter到ssh没有显示名称和没有$ DISPLAY环境变量

Gab*_*iel 30 python ssh numpy tkinter matplotlib

我正在尝试运行一个非常简单的代码,在集群中输出.png文件.这是代码:

import matplotlib.pyplot as plt
import numpy as np

x = np.random.randn(60)
y = np.random.randn(60)

plt.scatter(x, y, s=20)

out_png = 'path/to/store/out_file.png'
plt.savefig(out_png, dpi=150)
Run Code Online (Sandbox Code Playgroud)

如果我使用python simple_code.py安装了matplotlib 1.2.1的系统中的命令运行此代码,我会收到警告:

Unable to load library icui18n "Cannot load library icui18n:
Run Code Online (Sandbox Code Playgroud)

.png图像仍然生成,所以我没有问题.但是如果我在安装了matplotlib 1.3.0的集群中使用相同的命令和代码,则会失败并显示错误:

Traceback (most recent call last):
  File "simple_code.py", line 33, in <module>
    plt.scatter(x, y, s=20)
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 3078, in scatter
    ax = gca()
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 803, in gca
    ax =  gcf().gca(**kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 450, in gcf
    return figure()
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 423, in figure
    **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 79, in new_figure_manager
    return new_figure_manager_given_figure(num, figure)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 87, in new_figure_manager_given_figure
    window = Tk.Tk()
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1712, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?


添加,这是我用来登录集群的脚本:

#!/usr/bin/expect

set login "user"
set addr "address1"
set addr2 "address2"
set pw "password"

spawn ssh -X $login@$addr
expect "$login@$addr\'s password:"
send "$pw\r"
expect "$login@host:"
send "ssh -X $addr2\r"
expect "$login@$addr\'s password:"
send "$pw\r"
interact
Run Code Online (Sandbox Code Playgroud)

小智 35

你的问题是在ssh命令中.你需要做的就是这样写:

ssh -X "your_login"
Run Code Online (Sandbox Code Playgroud)

  • 作为一个FYI,这不是OP问题的解决方案.我在自己的回答中建议,然后当OP告诉我它没有解决问题时将其删除.问题与此处给出的问题相同,它也包含解决方案:http://stackoverflow.com/q/2801882/1399279. (12认同)
  • 提醒一下,`ssh -X` 有时可能会给你这样的警告,比如`警告:不受信任的 X11 转发设置失败:xauth 密钥数据未生成`,在这种情况下,你应该改为使用 `ssh -Y`。 (2认同)