2011-11-08 8 views
5

me gustaría hacer algo como esto en un archivo de origen, QT.py:¿Cómo se puede seleccionar fácilmente entre PyQt o PySide en tiempo de ejecución?

import sys 
import PyQt4 

sys.modules["Qt"] = PyQt4 

A continuación, importar este archivo en otros ficheros fuente, y utilizar de esta manera:

import QT 
from Qt.QtCore import * 
Así

puedo cambiar de PyQt4 a PySide en QT.py sin tocar todos los archivos de origen (con una secuencia de comandos sed posiblemente feo) Estos módulos son en su mayoría API compatibile y me gustaría poner a prueba a los dos. ¿Hay una forma fácil de hacer esto? (Debido a las formas que probé no están funcionando)

Tal vez la necesito imp módulo, pero parece demasiado bajo nivel. actualización

Respuesta

2

: averiguado método más acorde con sus necesidades:

Puede estructurar su pseudo-módulo como:

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

Dónde Qt/__init__.py es:

import QtCore, QtGui 

Qt/QtCore/__init__.py es:

from PyQt4.QtCore import * 

Qt/QtGui/__init__.py es:

from PyQt4.QtGui import * 

Luego, en su código, puede hacer referencia a ella de la siguiente manera:

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

from Qt.QtGui import * 

window = QWidget() 
window.show() 

app.exec_() 

I altamente recomendamos el uso de from Qt.QtGui import * en el código como la importación de todo se considera una mala forma en Python ya que pierde todos los espacios de nombres en el proceso.

actualización: Me gusta la sugerencia de Ryan de las importaciones condicionales. Recomiendo combinar eso en el código anterior. Por ejemplo:

Qt/QtGui/__init__.py:

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

No estoy seguro acerca de agregar pseudo-módulos vacíos al proyecto. Especialmente porque PySide/PyQt contiene muchos más submódulos. –

+0

@Guttalax Dijiste que esto es para probar, ¿verdad? No me gustaría hacer algo tan raro como este en un entorno de producción. Si lo estás haciendo en producción, entonces no "import *".Sin eso, puedes hacer algo tan simple como 'Qt/__ init __. Py' donde' __init __. Py' es 'de PyQt4 import *'. Entonces puede hacer referencia a cosas como 'Qt.QtGui.QWidget()' – Nathan

+0

Bueno, sí, es para probar. Verán, este es un proyecto de hobby mío y no me importan las soluciones un tanto hambrientas. Idealmente, me gustaría proporcionar una manera fácil para que otros cambien entre pyside y pyqt o incluso que el programa use lo que esté disponible. –

0

Se pueden ingresar condicionalmente bibliotecas de importación. Aquí es un poco de un ejemplo hacky, donde el registro para un argumento de línea de comandos de "PyQt4":

import sys 

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

Utilice un gancho de importación:

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 

Salida:

$ 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'> 
Cuestiones relacionadas