2009-12-03 3 views
1

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

ответ

0

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

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

  1. В вашем питона скрипт обнаружения, присутствует ли X.
  2. Если это не => использовать GTK on DirectFramebuffer (тогда не требуется X). Вам нужно будет скомпилировать GTK на DirectFB (и/или pygtk) из источника (some pointers here).
0

Если на удаленном компьютере установлен 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

Распространение X.Org распространяется на Xvfb и Xfake, которые могут использоваться для аналогичных целей. Кроме того, я бы, вероятно, использовал 'startx \', какой python \ '-c myscript.py - \' который Xvnc \ ': 7', который автоматически настроит среду для клиента и отменит X-сервер, как только это будет сделано , – ephemient

+0

@ephemient: На основании информации о вопросе я предположил, что на удаленных серверах нет установки X.Org. – tzot

+0

Правильно, но сервер VNC UNIX содержит порт X.Org в любом случае. Если OP требует частей X.Org, не имеет значения, какие части они до тех пор, пока они работают; нет ничего особенного в «Xvnc». – ephemient

0

В вашем myscript.py, вы могли бы сделать, как этот

if __name__=="__main__": 
    import gtk 

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

+0

Но если скрипт обращается к чему-либо в gtk.' вне функций (например, наследует от класса gtk), он будет терпеть неудачу с NameError. –

3

Импорт модулей в 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 вызывает очень мало ошибок! Импорт больше ломается, например. неправильные имена. Для более качественных проверок используйте tools like Pychecker/Pyflakes.

+0

+1 для указания инструментов проверки! Я бы порекомендовал [flake8] (https://pypi.python.org/pypi/flake8). – schlamar

0

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

Смежные вопросы