python gtk模块导入时自动打开显示器

1 投票
5 回答
1853 浏览
提问于 2025-04-15 16:39

我正在使用一个技巧,命令是“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 个回答

0

你说的 '语法检查' 到底是什么意思呢?
难道不能用像 pylint 这样的工具来检查语法错误吗?

另外:有一个很丑陋(但可能可行)的解决办法:

  1. 在你的 Python 脚本中检查是否有 X。
  2. 如果没有的话,就使用 GTK on DirectFramebuffer(这样就不需要 X 了)。你需要从源代码编译 GTK on DirectFB(和/或 pygtk),这里有一些提示)。
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
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的语法并不能捕捉到很多错误!导入模块可以捕捉到更多错误,比如拼写错误。为了获得更好的检查效果,可以使用一些工具,比如Pychecker / Pyflakes

撰写回答