2011-11-08 71 views
5

我願做這樣的事情在一個源文件,QT.py:如何在運行時輕鬆選擇PyQt或PySide?

import sys 
import PyQt4 

sys.modules["Qt"] = PyQt4 

然後在其它源文件導入此文件,並使用它像這樣:

import QT 
from Qt.QtCore import * 

所以我可以從PyQt4更改爲QT.py中的PySide,而無需觸及所有源文件(使用可能很難看的sed腳本) 這些模塊主要是API兼容的,我想對它們進行測試。是否有捷徑可尋? (因爲我試過的方法不起作用)

也許我需要imp模塊,但它似乎太低級別。

回答

2

更新:想通了方法更符合您的要求:

你可以組織你的僞模塊:

Qt/ 
Qt/__init__.py 
Qt/QtCore/__init__.py 
Qt/QtGui/__init__.py 

其中Qt/__init__.py是:

import QtCore, QtGui 

Qt/QtCore/__init__.py是:

from PyQt4.QtCore import * 

Qt/QtGui/__init__.py是:

import sys 
from Qt import QtGui 
app = QtGui.QApplication(sys.argv) 

from Qt.QtGui import * 

window = QWidget() 
window.show() 

app.exec_() 

高度建議不要在代碼中使用from Qt.QtGui import *作爲進口一切:

from PyQt4.QtGui import * 

然後,在你的代碼,你可以引用它,如下由於您在進程中丟失了所有命名空間,因此在Python中將視爲不良格式。

更新: 我喜歡瑞恩的有條件進口建議。我建議將其合併到上面的代碼中。例如:

Qt/QtGui/__init__.py

import sys 
if '--PyQt4' in sys.argv: 
    from PyQt4.QtGui import * 
else: 
    from PySide.QtGui import * 
+0

我不確定是否向項目添加了空的僞模塊。特別是因爲PySide/PyQt包含更多的子模塊。 –

+0

@Guttalax你說這是測試,對吧?我不想在生產環境中做這樣的事情。如果你正在生產,那麼不要'輸入*'。沒有這一點,你可以做一些簡單的事情,比如'Qt/__ init __。py',其中'__init __。py'是來自PyQt4 import *'。那麼你可以參考一下'Qt.QtGui.QWidget()' – Nathan

+0

好吧,是的,它是用於測試。你看,這是我的一個愛好項目,我不介意有點駭人聽聞的解決方案。理想情況下,我想爲其他人在pyside和pyqt之間切換或甚至讓程序使用可用的任何一種方法提供一種簡單方法。 –

0

可以有條件地導入庫。這是一個有點哈克例如,當您檢查 「PyQt4的」 的命令行參數:

import sys 

if sys.argv[-1] == 'PyQt4': 
    import PyQt4 
    sys.modules["Qt"] = PyQt4 
else: 
    import Qt 
    from Qt.QtCore import * 
4

使用導入鉤:

def set_qt_bindings(package): 
    if package not in ('PyQt4', 'PySide'): 
     raise ValueError('Unknown Qt Bindings: %s' % package) 
    import __builtin__ 
    __import__ = __builtin__.__import__ 
    def hook(name, globals=None, locals=None, fromlist=None, level=-1): 
     root, sep, other = name.partition('.') 
     if root == 'Qt': 
      name = package + sep + other 
     return __import__(name, globals, locals, fromlist, level) 
    __builtin__.__import__ = hook 

if __name__ == '__main__': 

    import sys 

    if len(sys.argv) > 1: 

     set_qt_bindings(sys.argv[-1]) 

     import Qt 
     print Qt 

     from Qt import QtCore 
     print QtCore 

     from Qt.QtGui import QWidget 
     print QWidget 

輸出:

$ python2 test.py PySide 
<module 'PySide' from '/usr/lib/python2.7/site-packages/PySide/__init__.py'> 
<module 'PySide.QtCore' from '/usr/lib/python2.7/site-packages/PySide/QtCore.so'> 
<type 'PySide.QtGui.QWidget'> 
$ python2 test.py PyQt4 
<module 'PyQt4' from '/usr/lib/python2.7/site-packages/PyQt4/__init__.pyc'> 
<module 'PyQt4.QtCore' from '/usr/lib/python2.7/site-packages/PyQt4/QtCore.so'> 
<class 'PyQt4.QtGui.QWidget'>