Модуль Python GTK открывает дисплей при импорте - PullRequest
1 голос
/ 03 декабря 2009

Я использую трюк "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.

Ответы [ 5 ]

3 голосов
/ 06 января 2010

При импорте модулей в 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 .

0 голосов
/ 06 января 2010

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

0 голосов
/ 04 декабря 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
0 голосов
/ 04 января 2010

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

if __name__=="__main__":
    import gtk

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

0 голосов
/ 03 декабря 2009

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

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

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