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显示器。
5 个回答
你说的 '语法检查'
到底是什么意思呢?
难道不能用像 pylint 这样的工具来检查语法错误吗?
另外:有一个很丑陋(但可能可行)的解决办法:
- 在你的 Python 脚本中检查是否有 X。
- 如果没有的话,就使用 GTK on DirectFramebuffer(这样就不需要 X 了)。你需要从源代码编译 GTK on DirectFB(和/或 pygtk),这里有一些提示)。
如果远程机器上安装了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
在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。