PyQt4:QtHelpビルドの問題

すべては、Kubuntu 12.04にPython3とEric5をインストールしたいという事実から始まりました。 PangolinリポジトリにはEric4のみが存在するため、ソースからすべてを手に入れることが決定されました。 実際、このようなインストールでは複雑なことは何もありません。Python3、 SIPPyQt4QScintilla2の順にインストールします。 一見、すべてがスムーズに進みました。 私はディストリビューションでディレクトリに急ぎます(私は言葉を恐れていません)Eric5と宝物を集めます



sudo python3 install.py







コンソールでスクリプトが発行されたときの驚きを想像してください



Found PyQt4

Sorry, please install QtHelp.

Error: No module named QtHelp








おかしい、私は、インストーラーがバグだと思う? コンソールで3番目のPythonインタープリターを起動し、紹介します



>>> import PyQt4.QtHelp

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ImportError: No module named QtHelp








QtHelpが実際にインストールしなかったことがわかりました。 私には十分な空き時間があったので、私は、Windowsを使用してから残った古い習慣に従って、単純にPyQt4を再構築することにしました。 彼はおいしい夕食と問題の早期解決を期待して、組み立てプロセスを開始し、dump子を揚げました。 揚げた、食べた、喫煙した、ラップトップに戻り、チェックした-同じこと、問題は残った。



私はすべてを知っているGoogleに頼ることにした。 すべてを知っている問題が述べられましたが、解決策は出ませんでした。 誰かが決めなかった、誰かが単にそれを持っていない。 ここではバグが修正された言っていますが。 はい、修正済みです。



メスを手に取り、徹底的な調査を開始する以外に何もすることはありません。 まず、configure.pyスクリプトのコンソール出力に興味がありました。C++でソースを生成し、そこからmakeがバイナリライブラリファイルを収集するのは彼の責任だからです。 このスクリプトは非常に多くのテキストを印刷しますが、QtHelpの問題に関連する部分のみが私にとって重要でした。



Checking to see if the QtGui module should be built...

Checking to see if the QtHelp module should be built...

Checking to see if the QtMultimedia module should be built...



...



These PyQt modules will be built: QtCore, QtGui, QtNetwork, QtDBus,

QtDeclarative, QtOpenGL, QtScript, QtScriptTools, QtSql, QtSvg, QtTest,

QtWebKit, QtXml, QtXmlPatterns, QtDesigner.








ここでは、スクリプトがQtHelpモジュールをビルドする機能をチェックしたことがわかりますが、明らかに、チェックは失敗しました。 構築可能なモジュールの最終リストには、QtHelpがありません。 実際、PyQt4のインストール元のディレクトリを見ると、configure.pyスクリプトが、すべてのQtモジュールのC ++コードを含む同じサブディレクトリ(QtCore、QtQui、QtNetworkなど)を作成したことがわかります。 QtHelpを除く全員。



ここでは、スクリプトの内部を見て、2つのことを確認する必要があります。 まず、「モジュールが構築される」リストは何ですか。 次に、データがそこに到達する方法。 ケイトでconfigure.pyを開き、大切なテキストを探して、次のコードを確認します。



  sipconfig.inform("The Qt mkspecs directory is in %s." % qt_datadir) sipconfig.inform("These PyQt modules will be built: %s." % ", ".join(pyqt_modules)) sipconfig.inform("The PyQt Python package will be installed in %s." % opts.pyqtmoddir)
      
      







ええ、データはpyqt_modulesリストに保存されます。 彼らはどうやってそこに着くのですか? 確かに、次のモジュールをチェックするとき。 ここで、「<bla-bla-bla>モジュールをビルドする必要があるかどうかを確認する」というテキストのスクリプトを調べる価値があります。



 def check_module(mname, incfile, test, extra_include_dirs=None, extra_lib_dirs=None, extra_libs=None): """See if a module can be built and, if so, add it to the global list of modules. mname is the name of the module. incfile is the name of the include file needed for the test. test is a C++ statement being used for the test. extra_include_dirs is an optional list of extra include directories. extra_lib_dirs is an optional list of extra library directories. extra_libs is an optional list of extra libraries. """ # Check that the module is enabled if we are not automatically enabling all # modules. if len(opts.enabled) > 0 and mname not in opts.enabled: return # Check the module's main .sip file exists. if os.access(os.path.join(src_dir, "sip", mname, mname + "mod.sip"), os.F_OK): sipconfig.inform("Checking to see if the %s module should be built..." % mname) if check_api(incfile, test, mname, extra_include_dirs=extra_include_dirs, extra_lib_dirs=extra_lib_dirs, extra_libs=extra_libs): pyqt_modules.append(mname)
      
      







ビンゴ! これはまさにあなたが必要とするものです! ここで、check_api()の呼び出しが成功すると、pyqt_modulesリストに別の値(チェックされているモジュールの名前)が補充されることがわかります。 最初は、check_api()の呼び出しを取得したかったのですが、基本ロジックはこれが正しい方法であると示唆しました。 しかし、何が私を襲ったのかはわかりませんが、check_module()チェックプロシージャを呼び出すコードを調べることにしました。



  def check_modules(self): ... # Note that the order in which we check is important for the # consolidated module - a module's dependencies must be checked first. pyqt_modules.append("QtCore") check_module("QtGui", "qwidget.h", "new QWidget()") check_module("QtHelp", "qhelpengine.h", "new QHelpEngine(\"foo\")") check_module("QtMultimedia", "QAudioDeviceInfo", "new QAudioDeviceInfo()")
      
      







そして、チェックなしでpyqt_modulesにQtCoreが追加されていることに気付きました。 実験への渇望は苦労しました:QtHelpをそのように追加してみませんか? 実際、ファイルの場合、私は何も失うことなく、さらに「ピック」を続けます。成功した場合は、お気に入りのIDEでより速く作業を開始します。 すぐに言ってやった。 check_module( "QtHelp")の呼び出しについてコメントし、代わりにpyqt_modules.append( "QtHelp")を挿入します。 もう一度スクリプトを実行しますが、すでに薬明のウィンドウで



Generating the C++ source for the QtHelp module...

Creating the Makefile for the QtHelp module...








ソースでQtHelpディレクトリの可用性を確認します-そうです。 それは小さな問題です。長いメイクとインストールを開始し、ホットコーヒーのカップの下でアセンブリとインストールが完了するのを待ちます。 Eric5を再インストールしよう-出来上がり! すべてが設定され、IDEは時計のように機能します!



もちろん、これはかなり汚いハックです。 良い方法で、ドアの鍵を拾うことは価値があり、ドアをdoorで切り倒すことはありませんでした。 しかし、ペテロ大帝によって同様の行動がずっと前に行われました。



All Articles