Повторяющаяся проблема с построением графиков в WSL Ubuntu - PullRequest
1 голос
/ 29 марта 2020

Я пишу код, который должен отображать простую функцию, и она временно работает, но я продолжаю сталкиваться с таким циклом проблем при перезагрузке компьютера:

  1. При первой попытке запустить код, он не отправляет никаких ошибок, но и не создает никаких графиков.

-> Чтобы решить эту проблему, я установил Xming и написал команду export DISPLAY=localhost:0.0 в bash, как предложено AwokeKnowing в Показать графики matplotlib в Ubuntu (Windows подсистема для Linux) .

Когда я запускаю код с вышеуказанными настройками, я получаю следующую ошибку:
_tkinter.TclError: no display name and no $DISPLAY environment variable.

-> Чтобы решить эту проблему, я добавляю строку кода:

matplotlib.use('Agg')

в соответствии с предложением Serenity in _tkinter.TclError: без отображаемого имени и без переменной окружения $ DISPLAY

После выполнения этого кода и запуска кода, он изначально отображается правильно. Но если я попробую еще раз, это не так. Код работает нормально, но график не отображается.

-> Чтобы это заработало, я убираю строку кода:

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. Я использую Python3 в Ubuntu.

1 Ответ

1 голос
/ 30 марта 2020

Для устаревшего 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 $2"."$3}') | 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 $2"."$3}') | 
                  awk '{for(i=1; i <=NF; i++) {if($i == "netmask") print $(i+1)}}' | 
                  awk -F'.' '{print $3"."$4}') 
                 | tr "\n" " " | awk '{print $1":"$2}')

В любом случае вам также может понадобиться отключить контроль доступа в вашем клиенте xserver - я не конечно, в Xming, но vcxsrv просто требует аргумент командной строки -ac или для проверки Отключить контроль доступа во время запуска. Вам также необходимо убедиться, что брандмауэр windows разрешает подключения. Вы можете найти эту тему полезной.

Также обратите внимание, что 'Agg' не является gui бэкэндом, при использовании он не будет отображать цифры. Я считаю, что с моей настройкой 'TkAgg' работает лучше всего.

...