Python в GMS 3.4.x - сбой DM при использовании matplotlib.pyplot: не удалось найти или загрузить плагин платформы Qt для windows - PullRequest
2 голосов
/ 28 марта 2020

Я не могу заставить matplotlib.pyplot работать под GMS 3.4. Он продолжает сбой DM со следующим сообщением об ошибке

This application failed to start because it could not find or load the Qt platform plugin

Когда я запускаю этот код (взят из справочного документа DM):

import sys
sys.argv.extend(['-a', ' '])
import numpy as np
import matplotlib.pyplot as plt

t = np.arange( 0.0, 3.0, 0.01)
s1 = np.sin(2 * np.pi * t)
plt.plot(t, s1)
plt.show()

Переустановка / восстановление GMS, похоже, не решает проблему. Я довольно новичок в Python, поэтому я мог пропустить что-то очевидное?

Ответы [ 3 ]

2 голосов
/ 29 апреля 2020

Несмотря на то, что исправление, представленное miile7, выполняет свою работу, я хотел бы предложить альтернативное решение:

Как очень хорошо указал miile7, установка глобальной переменной среды может мешать работе другого программного обеспечения и должна быть избегать. Чтобы DM нашел платформу Qt, можно просто

Скопировать папку

ProgramData\Miniconda3\envs\GMS_VENV_PYTHON\Library\plugins\platforms

в

Program Files\Gatan

или, более конкретно, местоположение DigitalMicrograph.exe

Более общую тему, не связанную с GMS, можно найти здесь :

Изменение QT_PLUGIN_PATH в переменных среды приводит к сбою программ

Обновление:

Вероятно, лучше создать соединение, выполнив следующую команду ( с правами администратора):

mklink /J "C:\Program Files\Gatan\platforms" "C:\ProgramData\Miniconda3\envs\GMS_VENV_PYTHON\Library\plugins\platforms"

Проблема по-прежнему решается таким образом, и в случае, если вы обновляете / модифицируете Qt в своей Miniconda, DM все равно должен найти последнюю версию.

1 голос
/ 23 апреля 2020

Я тоже хотел использовать python в GMS, и у меня возникла та же ошибка. Мне потребовалось несколько часов, чтобы выяснить, почему и как это исправить:

TL; DR

Сохраните следующий код как start-gatan.bat и используйте этот файл start-gatan.bat для запуска GMS. Файл может быть размещен где угодно. Обратите внимание, что окно консоли должно оставаться открытым, пока GMS активен!

@echo off

rem
rem File: start-gatan.bat
rem ---------------------

SET QT_PLUGIN_PATH=%ProgramData%\Miniconda3\envs\GMS_VENV_PYTHON\Library\plugins
SET gms_path=%PROGRAMFILES%\Gatan\DigitalMicrograph.exe

echo Starting GMS
echo Do not close this window!

"%gms_path%"

Важное примечание : чтобы отобразить окно matplotlib, необходимо снять флажок «Выполнить в фоновом потоке» - флажок в нижнем колонтитуле панели кода! Кроме того, выполнение занимает сравнительно много времени.


Причина

Это не ошибка GMS и не ошибка python, а ошибка Qt. Для рендеринга windows matplotlib (по умолчанию) используется PyQT, который использует Qt. Ошибка говорит о qwindows.dll и о том, что он не может быть найден (явно?).

Примечание: : Средство визуализации можно изменить , добавив, например, matplotlib.use('GTK3Agg'). Это больше не показывает Qt -Error, но показывает другую ошибку, поэтому я не следовал этой идее.

Решение

qwindows.dll находится в %ProgramData%/Miniconda3/envs/GMS_VENV_PYTHON/Library/plugins/platforms. Путь для плагинов платформы может быть установлен в qt.conf (но это не исправило меня, который, в этой теме упоминают, что могут быть различия ) или в переменной среды %QT_PLUGIN_PATH% как я нашел здесь .

Поэтому добавьте (создайте) системную переменную %QT_PLUGIN_PATH% со значением %ProgramData%\Miniconda3\envs\GMS_VENV_PYTHON\Library\plugins. Системная переменная в Windows может быть добавлена ​​в Панель управления > Система > Расширенные настройки системы > Переменные среды . 1

Обратите внимание, что эта переменная среды должна присутствовать только для GMS, а не для всех других программ QT. Поэтому создайте start-gatan.bat и скопируйте код в верхней части раздела TL; DR. Теперь запустите GMS, дважды щелкнув по start-gatan.bat, и ваш пример кода будет работать.

Важное примечание : чтобы показать окно matplotlib, вы должны снять галочку с «Выполнить в фоновом потоке» - флажок в нижнем колонтитуле панели кода, иначе окно графика не будет видно.

1 Добавление новой переменной среды работает, но если у вас есть еще одна программа, использующая QT (которая очень скорее всего, причина) вы столкнетесь с (почти) тем же сообщением об ошибке, но в другой программе. Если у вас есть только GMS pyqt, использующая QT, это может быть вашим решением.

Дополнительные примечания

Несколько тем форума , включая форум QT , рассказывают о дублирующих путях для этого qwindows.dll. Если мой ответ не помог вам, вы можете посмотреть на это. Обратите внимание, что проверка переменных среды должна выполняться в среде Miniconda. Поэтому обязательно запустите

activate GMS_VENV_PYTHON

перед выводом переменных. Также вы можете захотеть взглянуть на конфигурацию qt, которую можно найти по %PROGRAMDATA%/Miniconda3/envs/GMS_VENV_PYTHON/bin. Обратите внимание, что всегда есть файл в обычной директории Miniconda (%PROGRAMDATA%/Miniconda3/bin) и файл в envs.

0 голосов
/ 27 апреля 2020

Проверенный метод для запуска MatplotLib в GMS
(протестирован с GMS 3.4.1.2938 бета)

  • Запуск с чистой системы ( GMS не установлена, Python -for-GMS Miniconda не установлена)
  • Установить GMS с установщиком и включенной опцией Python.
  • Запустить приглашение Anaconda с правами администратора (справа) щелкните элемент в меню «Пуск»)
    Start the Anaconda-prompt with administrator rights
  • Чтобы активировать среду GMS_VENV_ PYTHON, введите activate GMS_VENV_PYTHON
  • Установите Matplotlib с помощью программы установки pip, набрав pip install Matplotlib (требуется соединение inte rnet)
  • Запустите DigitalMicrograph и запустите следующий тест-скрипт:
# This is a PYTHON script to be run in DigitalMicrograph
if ( False == DM.IsScriptOnMainThread() ):
    print( ' MatplotLib scripts require to be run on the main thread.' )
    exit()

import sys
sys.argv.extend(['-a', ' '])
import matplotlib.pyplot as plt
import numpy as np
a = np.linspace(0, 10, 100)
b = np.exp(-a)
plt.plot(a, b)

DM.ClearResults()
print('Start plotting. Script continues when figure is closed')
plt.show()
print('Done plotting.')

Result

И в качестве бонуса, поскольку речь идет о сценариях DM: используя возможность гибридного сценария, можно заключить вызов Python в строку и выполнить его непосредственно изнутри DM-скрипт:

// This is a DM-script
string pyScript
pyScript += "import sys" + "\n"
pyScript += "sys.argv.extend(['-a', ' '])" + "\n"
pyScript += "import matplotlib.pyplot as plt" + "\n"
pyScript += "import numpy as np" + "\n"
pyScript += "a = np.linspace(0, 10, 100)" + "\n"
pyScript += "b = np.exp(-a)" + "\n"
pyScript += "plt.plot(a, b)" + "\n"
pyScript += "plt.show()" + "\n"

ClearResults()
Result( "Script continues when figure is closed\n" )
ExecutePythonScriptString( pyScript, 1 ) // On Main-thread
Result( "Done plotting.\n" )
...