2011-11-08 12 views
5

मैं, एक स्रोत फ़ाइल में कुछ इस तरह करना चाहते हैं QT.py:रनटाइम पर आप पीईक्यूटी या पायसाइड के बीच आसानी से कैसे चयन कर सकते हैं?

import sys 
import PyQt4 

sys.modules["Qt"] = PyQt4 

फिर अन्य स्रोत फ़ाइलों में इस फ़ाइल को आयात, और इस तरह इसका इस्तेमाल:

import QT 
from Qt.QtCore import * 

तो मैं सभी स्रोत फ़ाइलों को छूए बिना QT.py में PyQt4 से PySide में बदल सकता हूं (संभावित रूप से बदसूरत sed स्क्रिप्ट के साथ) ये मॉड्यूल ज्यादातर API compatibile हैं और मैं उन्हें दोनों परीक्षण करना चाहता हूं। क्या इसे करने का कोई आसान तरीका है? (क्योंकि मैंने जिस तरीके से कोशिश की है वह काम नहीं कर रहा है)

शायद मुझे 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 है:

from PyQt4.QtGui import * 

फिर, अपने कोड में, आप इसे संदर्भित कर सकते हैं इस प्रकार है:

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 * उपयोग करने के खिलाफ सलाह देते हैं को पायथन में खराब रूप माना जाता है क्योंकि आप प्रक्रिया में सभी नामस्थान खो देते हैं।

अद्यतन: मुझे रियान के सशर्त आयात के सुझाव पसंद हैं। मैं उपर्युक्त कोड में संयोजन की सिफारिश करता हूं।

Qt/QtGui/__init__.py:

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

यहाँ एक hacky उदाहरण है, जहां आप "PyQt4" की एक कमांड लाइन तर्क के लिए जाँच का एक सा है मैं परियोजना में खाली छद्म मॉड्यूल जोड़ने के बारे में निश्चित नहीं हूँ। खासकर क्योंकि पाइसाइड/पीईक्यूटी में कई और सबमिड्यूल हैं। –

+0

@ गुटतालैक्स आपने कहा कि यह परीक्षण के लिए है, है ना? मैं उत्पादन वातावरण में इस तरह हैकी के रूप में कुछ नहीं करना चाहता। यदि आप इसे उत्पादन में कर रहे हैं, तो 'आयात *' न करें।इसके बिना, आप कुछ क्यूटी/__ init __। Py' के रूप में सरल कुछ कर सकते हैं जहां '__init __। Py'' PyQt4 आयात * 'से है। फिर आप चीजों को 'Qt.QtGui.QWidget() ' – Nathan

+0

के रूप में संदर्भित कर सकते हैं, हाँ, यह परीक्षण के लिए है। आप देखते हैं, यह मेरा एक शौक प्रोजेक्ट है और मुझे थोड़ा सा हैकिश समाधान नहीं है। आदर्श रूप से मैं दूसरों को पाइसाइड और पीईटीटीटी के बीच स्विच करने के लिए एक आसान तरीका प्रदान करना चाहता हूं या यहां तक ​​कि कार्यक्रम को जो भी उपलब्ध हो, उसे भी उपयोग करने देना आसान हो सकता है। –

0

आप सशर्त आयात पुस्तकालयों कर सकते हैं उदाहरण के लिए।

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'> 
संबंधित मुद्दे