2011-11-08 9 views
5

Mi piacerebbe fare qualcosa di simile in un file sorgente, QT.py:Come si può facilmente selezionare PyQt o PySide in fase di runtime?

import sys 
import PyQt4 

sys.modules["Qt"] = PyQt4 

Poi importare questo file negli altri file di origine, e usarlo in questo modo:

import QT 
from Qt.QtCore import * 
Così

Posso passare da PyQt4 a PySide in QT.py senza toccare tutti i file sorgente (con uno script possibilmente brutto) Questi moduli sono per lo più compatibili API e vorrei testarli entrambi. C'è un modo semplice per farlo? (Perché i modi che ho provato non funzionano)

Forse l'ho bisogno di modulo imp, ma sembra troppo basso livello.

risposta

2

aggiornamento: capito il metodo più in linea con le vostre esigenze:

È possibile strutturare la tua pseudo-modulo come:

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

Dove Qt/__init__.py è:

import QtCore, QtGui 

Qt/QtCore/__init__.py is:

from PyQt4.QtCore import * 

Qt/QtGui/__init__.py è:

from PyQt4.QtGui import * 

Poi, nel codice, è possibile fare riferimento come segue:

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

from Qt.QtGui import * 

window = QWidget() 
window.show() 

app.exec_() 

ho altamente consiglia di non utilizzare from Qt.QtGui import * nel codice l'importazione di tutto è considerato una cattiva forma in Python poiché si perdono tutti gli spazi dei nomi nel processo.

aggiornamento: Mi piace il suggerimento di Ryan delle importazioni condizionali. Consiglierei di combinarlo nel codice sopra. Per esempio:

Qt/QtGui/__init__.py:

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

Non sono sicuro di aggiungere pseudo moduli vuoti al progetto. Soprattutto perché PySide/PyQt contiene molti più sottomoduli. –

+0

@Guttalax Hai detto che questo è per il test, giusto? Non vorrei fare qualcosa di hacky come questo in un ambiente di produzione. Se lo stai facendo in produzione, non importare *.Senza quello, puoi fare qualcosa di semplice come 'Qt/__ init __. Py' dove' __init __. Py' è 'da PyQt4 import *'. Quindi puoi fare riferimento a cose come 'Qt.QtGui.QWidget()' – Nathan

+0

Beh, sì, è per testare. Vedi, questo è un mio progetto per hobby e non mi dispiace un po 'di soluzioni di hacker. Idealmente mi piacerebbe fornire un modo semplice per gli altri di passare da campagna a pyqt o magari lasciare che il programma usi quello che è disponibile. –

0

puoi condizionatamente librerie di importazione. Ecco un po 'di un esempio di hacky, dove si controlla per una riga di comando argomento di "PyQt4":

import sys 

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

Utilizzare un gancio di importazione:

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 

uscita:

$ 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'> 
Problemi correlati