2009-12-03 23 views
1

我正在使用「python -c」import myscript.py'「技巧對使用」導入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. 在你的Python腳本檢測X是否存在。
  2. 如果不是=>請使用GTK on DirectFramebuffer(否則不需要X)。您需要從源代碼(some pointers here)在DirectFB(和/或pygtk)上編譯GTK。
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服務器完成後拆除X服務器。 – ephemient

+0

@ephemient:基於問題信息,我假定遠程服務器中沒有任何X.Org安裝。 – tzot

+0

沒錯,但UNIX VNC服務器無論如何都包含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__'技巧來避免副作用,但它們仍可能失敗 - 就像發生在您身上一樣。

[BTW,漸漸導入錯誤意味着整個文件已經有了正確的語法。]

如果你只是想檢查語法,而不會在所有運行:

  • 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將檢查當前文件的語法而不運行它。