在 WSL 中绘制图形时反复出现问题 Ubuntu
Recurring problem with plotting graphs in WSL Ubuntu
我正在编写一个应该绘制一个简单函数的代码,它暂时可以工作,但是当我重新启动计算机时,我总是遇到这样的问题循环:
- 我第一次尝试 运行ning 代码时,它没有发出任何错误,但也没有创建任何图表。
--> 为了解决这个问题,我安装了 Xming 并按照 AwokeKnowing 的建议在 bash 中编写了 export DISPLAY=localhost:0.0
命令 在 .
- 当我 运行 代码时,通过上述调整,我得到以下错误:
_tkinter.TclError: no display name and no $DISPLAY environment variable.
--> 为了解决这个问题,我添加了这行代码:
matplotlib.use('Agg')
由 Serenity 在
中提出
- 执行此操作并 运行 编译代码后,最初可以正确绘制图形。但如果我改天再试一次,它不会。代码运行正常,但没有显示图形。
--> 为了让它工作,我删除了代码行:
matplotlib.use('Agg')
通过这样做,代码再次绘制图表。
然后,当我重新启动计算机时,一系列问题又重新开始了。
有谁知道我做错了什么?我对使用 Python 很陌生,所以我很可能遗漏了一些明显的东西。
以下是我的代码的相关部分:
#Imports
import matplotlib
import matplotlib.pyplot as ply
from dolfin import *
import numpy as np
from mshr import *
import math
from math import exp
plt.plot(tiemporeal,fcmM1)
plt.xlabel('Tiempo')
plt.ylabel('Resistencia')
plt.show()
非常感谢,对于可能出现的格式错误,我们深表歉意。
PS。我在 Ubuntu.
上使用 Python3
对于旧版 WSL,添加
应该就足够了
export DISPLAY=127.0.0.1:0
到您的 ~/.bashrc
文件 - 默认后端应该可以正常工作。对于 WSL 2,它更复杂,您需要从 /etc/resolv.conf
获取服务器名称,然后从 ifconfig
获取掩码。例如在我的系统上:
wmiller@lcl:~$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file,
# add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.28.176.1
和
wmiller@lcl:~$ ifconfig | grep 'inet '
inet 172.28.176.7 netmask 255.255.240.0 broadcast 172.28.191.255
inet 127.0.0.1 netmask 255.0.0.0
所以我的 DISPLAY
需要 172.28.176.7:240.0
。自动提取有点复杂,但将以下命令添加到 ~/.bashrc
对我有用:
export DISPLAY=$((ifconfig | grep -f <(cat /etc/resolv.conf | grep nameserver |
awk -F'[. ]' '{print "."}') | awk '{for(i=1; i <=NF; i++)
{if($i == "inet") print $(i+1)}}' ; ifconfig |
grep -f <(cat /etc/resolv.conf | grep nameserver |
awk -F'[. ]' '{print "."}') |
awk '{for(i=1; i <=NF; i++) {if($i == "netmask") print $(i+1)}}' |
awk -F'.' '{print "."}')
| tr "\n" " " | awk '{print ":"}')
在任何一种情况下,您可能还需要在您的 xserver 客户端中禁用访问控制 - 我不确定 Xming,但 vcxsrv 只需要命令行参数 -ac
或在启动期间检查禁用访问控制。您还需要确保 windows 防火墙允许连接。您可能会发现 this thread 有用。
还要注意'Agg'
是非gui后台,使用它不会显示数字。我发现我的设置 'TkAgg'
效果最好。
我正在编写一个应该绘制一个简单函数的代码,它暂时可以工作,但是当我重新启动计算机时,我总是遇到这样的问题循环:
- 我第一次尝试 运行ning 代码时,它没有发出任何错误,但也没有创建任何图表。
--> 为了解决这个问题,我安装了 Xming 并按照 AwokeKnowing 的建议在 bash 中编写了 export DISPLAY=localhost:0.0
命令 在
- 当我 运行 代码时,通过上述调整,我得到以下错误:
_tkinter.TclError: no display name and no $DISPLAY environment variable.
--> 为了解决这个问题,我添加了这行代码:
matplotlib.use('Agg')
由 Serenity 在
- 执行此操作并 运行 编译代码后,最初可以正确绘制图形。但如果我改天再试一次,它不会。代码运行正常,但没有显示图形。
--> 为了让它工作,我删除了代码行:
matplotlib.use('Agg')
通过这样做,代码再次绘制图表。
然后,当我重新启动计算机时,一系列问题又重新开始了。
有谁知道我做错了什么?我对使用 Python 很陌生,所以我很可能遗漏了一些明显的东西。
以下是我的代码的相关部分:
#Imports
import matplotlib
import matplotlib.pyplot as ply
from dolfin import *
import numpy as np
from mshr import *
import math
from math import exp
plt.plot(tiemporeal,fcmM1)
plt.xlabel('Tiempo')
plt.ylabel('Resistencia')
plt.show()
非常感谢,对于可能出现的格式错误,我们深表歉意。
PS。我在 Ubuntu.
上使用 Python3对于旧版 WSL,添加
应该就足够了export DISPLAY=127.0.0.1:0
到您的 ~/.bashrc
文件 - 默认后端应该可以正常工作。对于 WSL 2,它更复杂,您需要从 /etc/resolv.conf
获取服务器名称,然后从 ifconfig
获取掩码。例如在我的系统上:
wmiller@lcl:~$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file,
# add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.28.176.1
和
wmiller@lcl:~$ ifconfig | grep 'inet '
inet 172.28.176.7 netmask 255.255.240.0 broadcast 172.28.191.255
inet 127.0.0.1 netmask 255.0.0.0
所以我的 DISPLAY
需要 172.28.176.7:240.0
。自动提取有点复杂,但将以下命令添加到 ~/.bashrc
对我有用:
export DISPLAY=$((ifconfig | grep -f <(cat /etc/resolv.conf | grep nameserver |
awk -F'[. ]' '{print "."}') | awk '{for(i=1; i <=NF; i++)
{if($i == "inet") print $(i+1)}}' ; ifconfig |
grep -f <(cat /etc/resolv.conf | grep nameserver |
awk -F'[. ]' '{print "."}') |
awk '{for(i=1; i <=NF; i++) {if($i == "netmask") print $(i+1)}}' |
awk -F'.' '{print "."}')
| tr "\n" " " | awk '{print ":"}')
在任何一种情况下,您可能还需要在您的 xserver 客户端中禁用访问控制 - 我不确定 Xming,但 vcxsrv 只需要命令行参数 -ac
或在启动期间检查禁用访问控制。您还需要确保 windows 防火墙允许连接。您可能会发现 this thread 有用。
还要注意'Agg'
是非gui后台,使用它不会显示数字。我发现我的设置 'TkAgg'
效果最好。