Ipython: QXcbConnection: تعذر الاتصال بجهاز العرض

تم إنشاؤها على ٣١ مايو ٢٠١٧  ·  32تعليقات  ·  مصدر: ipython/ipython

عندما أقوم بإنشاء بيئة كوندا جديدة تمامًا:

conda create --name test ipython matplotlib

ثم حاول الحصول على import matplotlib.pyplot من داخل ipython ، أحصل على ما يلي:

In [1]: import matplotlib.pyplot

In [2]: QXcbConnection: Could not connect to display
Aborted

لا توجد مشكلة عندما أقوم بتشغيل نفس الشيء في قشرة ثعبان الفانيليا. يحدث لكل من py2.7.13 (ipython 5.3.0) و py3.6.1 (ipython 6.0.0).

لا أعرف ما إذا كان هذا خطأ في ipython أو خطأ كوندا ، لذلك أثرت مشكلة مع الأناكوندا أولاً ، لكنني أردت أن أشير إليها هنا أيضًا.

التعليق الأكثر فائدة

يوجد حل باستخدام متغيرات البيئة المتاحة هنا :

لقد نجح تعيين export QT_QPA_PLATFORM='offscreen' في .bash_profile بالنسبة لي.

ال 32 كومينتر

هل يمكنك التحقق من أن os.environ['DISPLAY'] هو نفسه في IPython كما هو الحال في Vanilla Python shell؟

أعتقد أنه قد يكون matplotlib هو اختيار خلفية مختلفة ، على الرغم من أنني لست متأكدًا من سبب قيامه بذلك.

صحيح - لقد نسيت أن أذكر أنني أقوم بتشغيل هذا على عقدة رأس الكتلة التي لا تحتوي على شاشة. لذلك لا توجد مجموعة DISPLAY ( os.environ['DISPLAY'] يعطي KeyError على كلا الصدفتين).

وإذا قمت بتعيين الواجهة الخلفية صراحةً على 'agg' فأنا أيضًا لا أحصل على الخطأ ، لكني أرغب في تجنب الاضطرار إلى القيام بذلك في كل مرة أقوم فيها بتشغيل ipython وأريد استيراد شيء يستورد matplotlib.

هل تستخدم واجهة IPython الطرفية أو IPython كنواة في واجهة Jupyter؟ أعتقد أن IPython كنواة يحدد متغير البيئة MPLBACKEND لإنتاج مخططات مضمنة بشكل افتراضي ، ولكن لا ينبغي أن يحدث ذلك مع IPython في المحطة. ولا أعتقد أن المؤامرات المضمنة تحتاج إلى خادم X ، على أي حال. : - /

كنت فقط أستخدم واجهة ipython الطرفية. يبدو أنه إذا لم يكن DISPLAY متاحًا ، فيجب أن تكون الواجهة الخلفية افتراضيًا لشيء لا يحتاج إليها ، ولكن لا يبدو أن هذا يحدث.

tacaswell أي فكرة لماذا قد يؤثر

يحدث هذا لأن الواجهة الخلفية الافتراضية لـ Matplotlib في Anaconda هي Qt5. نحن نفكر في تغييره إلى Tk لتجنب هذا النوع من المشاكل.

التغيير إلى Tk سيظل لديه نفس المشكلة.

أعتقد أنه يظهر على الفور مع IPython vs python لأنه إذا تم استيراد pyplot داخل IPython ، فإنه يلاحظ ويقوم بإعداد تكامل حلقة الحدث. في المطالبة البسيطة ، ستواجه مشكلة في النهاية عندما يحاول المستخدم إنشاء قطعة أرض.

أعتقد أن الانتقال إلى tk بشكل افتراضي سيكون أقل من رائع.

أعتقد أن الانتقال إلى tk بشكل افتراضي سيكون أقل من رائع.

ماذا تقصد بالضبط؟ هل تعتقد أنه من الأفضل أناكوندا البقاء مع Qt5؟

Qt5 هو إطار أفضل ويدعم الشاشات عالية الدقة خارج الصندوق ، وأعتقد أن العودة إلى Tk سيكون تراجعًا في تجربة المستخدم.

حسنًا ، نحن قلقون قليلاً بشأن تشغيل الكمبيوتر الدفتري في حاويات Docker مقطوعة الرأس. ولكن مع Matplotlib 1.5 (على ما أظن) ، يختار الكمبيوتر الدفتري تلقائيًا inline كخلفية افتراضية ، أليس كذلك؟

هذا هو تماما في الجانب المشتري.

إذا لم يتم تعيين متغير البيئة MPLBACKEND بالفعل ، يقوم ipykernel بتعيينه للإشارة إلى الواجهة الخلفية المضمنة. تقول التعليقات في الكود المصدري لدينا أن هذا سيؤثر على mpl> = 1.5 ، وأنه يأخذ الأولوية على matplotlibrc ولكن ليس أكثر من اختيار الواجهة الخلفية في الكود بشكل صريح.

هذا رائع حقا! ثم أقول إنه يمكن إغلاق هذا.

يمكن لـ OP ببساطة تعيين "agg" كخلفية افتراضية لـ Matplotlib في matplotlibrc الخاص به لتجنب هذا الخطأ.

إعادة قراءة هذا ، لاحظت أنه كان في الأصل حول IPython ، وليس النواة. ما قلته أعلاه حول إعداد MPLBACKEND لا ينطبق على IPython الطرفية.

سأغلق هذا الآن لأنني لا أعتقد أن ما تم الإبلاغ عنه هو خطأ في IPython. ربما يكون الأمر متروكًا للمستخدم لتهيئة خلفية مقطوعة الرأس ، أو ربما يجب أن يتحقق فحص MPL "داخل IPython" أيضًا مما إذا كان في بيئة بدون رأس. في كلتا الحالتين ، لا أعتقد أن هناك أي شيء يمكن أن يفعله IPython لإصلاحه.

لا تتردد في الاستمرار في استخدام هذه المشكلة كمكان لمناقشتها.

نعم ، يبدو من الواضح أنه ليس خطأ إيبيثون. أعتقد أنه يجب على MPL إجراء عمليات التحقق للسماح لشخص ما بتشغيل غلاف ipython واستيراد matplotlib.pyplot ، وعدم تعطله ، دون الحاجة إلى تغيير أي خيارات matplotlibrc أو تعيين الواجهة الخلفية بشكل صريح.

timothydmorton تكمن المشكلة في الاختلاف بين "طلب المستخدم فقط استخدام واجهة المستخدم الرسومية الخلفية ، لكنهم فقط قصدوا ذلك ، ويجب أن نعود إلى Agg" vs "طلب المستخدم فقط استخدام واجهة المستخدم الرسومية الخلفية ، لا يمكننا ذلك لأنه لا يوجد تشغيل X-Sever لذا يجب أن نعلمهم "من إدخال سلسلة. كانت المقايضة تاريخيًا لصالح المستخدمين التفاعليين ومنع الخطأ "لم تظهر أية مؤامرة" والسماح بحدوث خطأ "لا يمكنني استخدام واجهة خلفية تفاعلية على خادم بدون رأس" لأنه في الحالة اللاحقة يحصل المستخدم على رسالة واضحة خطأ في ما هو الخطأ.

كان هناك بعض النقاش مؤخرًا حول كيفية دعم "أي من نكهات Qt مثبتة على الإطلاق" كخلفية وكيفية القيام بالاحتياطات الخلفية ، ولكنها تصبح صعبة بشكل عام لأن أطر عمل واجهة المستخدم الرسومية تميل إلى التحرك على أصابع بعضها البعض إذا قمت باستيرادها في وقت واحد.

أنا أيضًا متأثر بهذه المشكلة ، ولا يمكنني التفكير في عمل جيد بجانب استخدام Python العادي بدلاً من ipython.

russelljjarvis إنه مصدر إزعاج بسيط ، ولكن إذا كان الأمر الأول الذي تقوم بتشغيله عند بدء تشغيل ipython هو import matplotlib; matplotlib.use('agg') فيجب أن يعمل ipython من أجلك.

نعم:

import matplotlib; matplotlib.use('agg')

هو أول أمر أقوم بتشغيله ، لكن ما زلت أحصل على:

In [1]: QXcbConnection: Could not connect to display :0
Aborted

بعد أن يصطدم البرنامج بخطأ ما ، وعادة ما أترك لدي مطالبة لتصحيح الأخطاء وتصحيح القرد.

قمت باستدعاء python باستخدام ipython -i file_name.py بعد أول تشغيل: ipcluster start -n 8 --profile=default &

حيث يكون السطر الأول من file_name هو import matplotlib; matplotlib.use('agg')

أتساءل عما إذا كان تشغيل ipcluster قد يسبب المشاكل.

يوجد حل باستخدام متغيرات البيئة المتاحة هنا :

لقد نجح تعيين export QT_QPA_PLATFORM='offscreen' في .bash_profile بالنسبة لي.

اقترح أحد الزملاء نفس الشيء مؤخرًا. في سياق Docker ، سيكون بيانك:
ENV QT_QPA_PLATFORM offscreen . أنا أختبر ذلك بشكل فعال الآن.

أنا على الحصول على نفس الخطأ:

أدى تعيين export QT_QPA_PLATFORM='offscreen' تغيير رسالة الخطأ إلى:

(python:17399): Gtk-WARNING **: cannot open display:

حل في دفتر الملاحظات مباشرة

import os
os.environ['QT_QPA_PLATFORM']='offscreen'

كمتابعة متأخرة ، اعتبارًا من Matplotlib 3.0 ، ندعم الآن تحديد الواجهة الخلفية تلقائيًا ولن نحاول استخدام واجهة المستخدم الرسومية الخلفية على خادم بدون رأس (ولكننا سنظل نحترم ملف rcparams الذي يطلب منا ذلك).

هذه الإجابة https://unix.stackexchange.com/questions/192642/wkhtmltopdf-qxcbconnection-could-not-connect-to-display
تم حلها بعد التثبيت يدويًا

"تحديث كوندا matplotlib" أصلح المشكلة بالنسبة لي.

الإعداد التالي يعمل !!!

تصدير QT_QPA_PLATFORM = "خارج الشاشة"

كمتابعة متأخرة ، اعتبارًا من Matplotlib 3.0 ، ندعم الآن تحديد الواجهة الخلفية تلقائيًا ولن نحاول استخدام واجهة المستخدم الرسومية الخلفية على خادم بدون رأس (ولكننا سنظل نحترم ملف rcparams الذي يطلب منا)

لا يمكن أن يدعم Matplotlib 3.1 الواجهة الخلفية التلقائية ، فنحن بحاجة إلى تعيين "Agg" يدويًا.

يحدث هذا لأن الواجهة الخلفية الافتراضية لـ Matplotlib في Anaconda هي Qt5. نحن نفكر في تغييره إلى Tk لتجنب هذا النوع من المشاكل.

أين يمكنني تغيير هذا؟

هذا هو خطئي بعد تعيين export QT_QPA_PLATFORM=offscreen

[tb571<strong i="7">@da02</strong> ~]$ jupyter console --kernel slicer-4.11
qt.qpa.plugin: Could not find the Qt platform plugin "offscreen" in ""
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

بعد تعيين QT_QPA_PLATFORM='offscreen' ، يتم تشغيل استيراد مكتبات matplotlib و fastai.
ومع ذلك ، فإن plt.figure () أو أي أمر آخر يخرج مخططًا يثير الأخطاء التالية:

This plugin does not support propagateSizeHints()
This plugin does not support raise()

أنا أتلقى هذا الخطأ أيضًا

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات