2011-11-08 6 views
5

私は1つのソースファイル、QT.pyにこのような何かをしたいと思います。そして、他のソースファイルで、このファイルをインポートし、このようにそれを使用実行時にPyQtとPySideのどちらを簡単に選択できますか?

import sys 
import PyQt4 

sys.modules["Qt"] = PyQt4 

:だから

import QT 
from Qt.QtCore import * 

すべてのソースファイルに触れずにQT.pyのPyQt4からPySideに変更することができます。 これらのモジュールはほとんどがAPIと互換性があり、私はその両方をテストしたいと思います。これを行う簡単な方法はありますか? (私が試した方法は機能していないので)

おそらくimpモジュールが必要ですが、低すぎるようです。

答えて

2

更新:あなたの要件に沿った方法より考え出し:

あなたのようにあなたの擬似モジュールを構築することができます

Qt/__init__.pyがある
Qt/ 
Qt/__init__.py 
Qt/QtCore/__init__.py 
Qt/QtGui/__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 *を使用しないことをお勧めしますは、プロセス中のすべての名前空間を失うため、Pythonでは悪い書式とみなされます。

更新: 私はRyanの条件付きインポートの提案が好きです。上記のコードに組み合わせることをお勧めします。

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あなたはこれがテスト用だと言っていますね。私は生産環境でこれほどハッキリなことをしたくないです。あなたが本番でそれをやっているなら、 'import *'をしないでください。それがなければ 'Qt/__ init __。py'のように簡単なことができます。' __init __。py'は 'from 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'> 
関連する問題