модуль python gtk открывает отображение при импорте

Я использую трюк «python -c 'import myscript.py'» для проверки синтаксиса скрипта, который использует «import gtk».

Я получаю следующую ошибку при выполнении проверки синтаксиса, которая подразумевает, что модуль gtk выполняет проверку для X-дисплея, хотя все, что делается на этом этапе, — это импорт модуля.

Traceback (most recent call last):

  File "<stdin>", line 15, in ?

      File "myscript.py", line 21, in ?

    import gtk

  File "/usr/src/build/463937-i386/install/usr/lib/python2.3/site-packages/gtk-2.0/gtk/__init__.py", line 37, in ?

RuntimeError: could not open display

Есть ли способ избежать этой ошибки при проверке синтаксиса?

Прежде чем вы спросите, я не могу установить $DISPLAY до запуска проверки синтаксиса. Проверка выполняется на удаленных серверах в рамках распределенной системы сборки. На этих серверах нет X-дисплея.


person Jeff Wilson    schedule 03.12.2009    source источник


Ответы (5)


Импорт модулей в Python выполняет их код!
Модули с хорошим поведением используют прием if __name__ == '__main__', чтобы избежать побочных эффектов, но они все равно могут дать сбой, как случилось с вами.

[Кстати, попадание в ImportError означает, что весь файл уже имеет правильный синтаксис.]

Если вы просто хотите проверить синтаксис, вообще не запуская:

  • python -m py_compile my_script.py
    проверит один файл (и создаст .pyc в качестве побочного эффекта).

  • python -m compileall ./
    будет рекурсивно проверять весь каталог.

  • python -c 'compile(open("myscript.py").read(), "myscript.py", "exec")'
    избегает создания .pyc.

Но обратите внимание, что простая проверка синтаксиса в Python позволяет обнаружить очень мало ошибок! Импорт улавливает больше, например. имена с ошибками. Для еще более точных проверок используйте такие инструменты, как Pychecker/Pyflakes.

person Beni Cherniavsky-Paskin    schedule 06.01.2010
comment
+1 за указание на инструменты проверки! Однако я бы рекомендовал flake8. - person schlamar; 13.03.2014

Что именно вы подразумеваете под 'syntax checking'?
Разве вы не можете использовать такой инструмент, как pylint, чтобы проверить для синтаксических ошибок?

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

  1. В вашем скрипте Python определите, присутствует ли X.
  2. Если это не так => используйте GTK в DirectFramebuffer (тогда X не требуется ). Вам потребуется скомпилировать GTK на DirectFB (и/или pygtk) из исходного кода (некоторые указатели здесь).
person ChristopheD    schedule 03.12.2009

Если на удаленной машине установлен vncserver, вы можете запустить фиктивный сервер и подключиться к нему. Пример инструкции:

remotemachine $ vncserver -depth 16 -geometry 800x600 :7
New 'X' desktop is remotemachine:7

Starting applications specified in /home/user/.vnc/xstartup
Log file is /home/user/.vnc/userve:7.log
remotemachine $ DISPLAY=:7 python -c 'import myscript.py'
…
remotemachine $ vncserver -kill :7
Killing Xtightvnc process ID 32058
person tzot    schedule 04.12.2009
comment
В дистрибутив X.Org входят версии Xvfb и Xfake, которые можно использовать для аналогичных целей. Кроме того, я бы, вероятно, использовал startx `which python` -c myscript.py -- `which Xvnc` :7, который автоматически настроит среду для клиента и отключит X-сервер, как только это будет сделано. - person ephemient; 04.01.2010
comment
@ephemient: Основываясь на информации о вопросе, я предположил, что на удаленных серверах нет установки X.Org. - person tzot; 05.01.2010
comment
Верно, но сервер UNIX VNC все равно содержит порт X.Org. Если OP нужны части X.Org, не имеет значения, какие это части, пока они работают; в Xvnc нет ничего особенного. - person ephemient; 05.01.2010
comment
Не знаю, зачем нужно говорить очевидное: в Xvnc нет ничего особенного и есть ли общий код между Xvnc и X.Org. Я пытаюсь перечитать свои тексты, чтобы увидеть, возможно, я считаю, что Xvnc — это панацея от всех проблем с сервером и администратором. Вместо этого я думаю, что между X.Org и Xvnc администратор очевидно выбрал бы Xvnc только из-за его меньшего размера пакета, при условии, что оба не установлены, и поэтому я могу не понимаю, на чем вы настаиваете. - person tzot; 05.01.2010
comment
Исходники Xvnc содержат копию X.Org xserver; Xfake и Xvfb созданы на основе подмножества X.Org xserver. В любом случае нет необходимости устанавливать весь дистрибутив X.Org, и apt-get install [vncserver/xvfb/...] или что-то другое, подходящее для системы OP, вероятно, вытащит минимально необходимые биты. Если у OP есть PyGTK, все необходимые биты клиентской библиотеки X в любом случае установлены, поэтому большая часть дистрибутива X.Org уже присутствует. - person ephemient; 05.01.2010
comment
Хорошо, спасибо. Надеюсь, можно установить небольшое подмножество X.Org+Xfake/Xvfb, которое по размеру сравнимо с Xvnc. Однако я не буду обновлять свой ответ, так как это не то, что я лично знаю/проверял. - person tzot; 05.01.2010

В вашем myscript.py вы можете сделать так

if __name__=="__main__":
    import gtk

Это не будет выполнять gtk __init__.py, когда вы делаете "python -c 'import myscript.py'"

person YOU    schedule 04.01.2010
comment
Но если скрипт обращается к чему-либо в gtk. за пределами функций (например, наследуется от класса gtk), он завершится ошибкой NameError. - person Beni Cherniavsky-Paskin; 06.01.2010

Если вы редактируете с помощью IDLE, Alt+X проверит синтаксис текущего файла, не запуская его.

person Beni Cherniavsky-Paskin    schedule 06.01.2010