2016-10-30 8 views
0

でexeファイルのcythonと包装してコンパイル、PYDファイルにサードパーティのLIBSを追加し、私は次のように私は私のsetup.pyを作成し、PYDするPYから一つのファイルをコンパイルするcythonを使用しています:はpyInstallerの

from setuptools import setup from Cython.Build import cythonize

setup(
    name = "My App", 
    ext_modules = cythonize(['src\\lib\\module.py']) 

from src.lib.module import myclass

私はコマンド「のpython main.py」と私のアプリを実行することが仕事ですが、エルを実行したときにはImportErrorないモジュール化例外を投げることpyInstallerので生成された.EXE:次のようにそれはmain.pyで輸入されますn amedモジュール。

pyinstallerのspecファイルのhidden-importでmodule.pydをインポートしようとしましたが、エラーが発生しました。モジュールのインポート要求はありません。要求はmodule.pydで使用されています。

私はなぜcythonまたはpyinstallerがモジュールをインポートしないのか、または実際の問題が何であるかというリクエストをインストールしていますか?

答えて

0

あまりにも多くのコードを見ずに物事のカップル、オーケーを見たい場合は、GNUコンパイラは「libmyclass.so」あなたはあなたのライブラリーに名前を付けることを確認するために、もう一つ注意すべき...

本当に拡張機能の名前を "src.libs.myGridLayout"にしますか?意味、行ってよろしいですか

import src.libs.myGridLayout 

あなたのpythonファイルには?これがあなたのデザインなら、それはあなたがすることです。名前は実際の拡張の名前です。

library_dirは「外部」ライブラリを検索する場所です。 (Windows.libのような)Cythonはあなたが書いたコードのためにあなたのプロジェクトのための適切なライブラリをリンクしますが、それ以外のもの、つまり "libraries"ディレクトリに置くものです。

「namelibrary.lib」とは何ですか? yoruプロジェクトで使用したいライブラリの場合は、そのライブラリが見つかった場所にパスを追加し、ライブラリに「namelibrary」を追加します。

この拡張機能をcython用に書いた方法を見てみると、やや遅くなり、プロジェクトを設定する方法と、これらの拡張機能を使用する方法。がんばろう! :)

+0

今のところ、私はpyinstallerフックで私の問題を解決しました。外部拡張として、私は要求を持っていますが、私のインポートのほとんどは私が作成した内部ライブラリです。助けてくれてありがとう。 – aeRogelio

0

libを作成するpyInitファイルでは、プロジェクトのライブラリとライブラリディレクトリをリンクするように設定できます。例

extensions = [ Extension(name="xxxx",sources=["xxx.pyx"], libraries=["myclass"], library_dirs=["/src/libdirectory"], language="c++",), ]

のためにこれは、ライブラリを探すためにcythonリンカに指示します。あなたはリンカが「MyClassの」

+0

私は窓で働いていますが、私は自分のライブラリに「my_module.py」と名前をつけました。クラスモジュールでは、Windowsで問題が起こるのでしょうか? 2.私のディレクトリ構造は、より少なくて済みます。 mainfolder-> main.py、setup.py mainfolder-> libs-> __init__.py、my_module.py pyInitでmain.pyまたは__init__を参照してください。 pys libsフォルダまたはsetup.py – aeRogelio

+0

さらに何か、私はあなたが私を渡したコードを理解していない、私は少しのドキュメントを確認し、戻って言う。 – aeRogelio

+0

これは単に、.exeリンカーがあなたのモジュールを見つけることができないことを意味します。私がshowd(拡張機能のcythonドキュメントを見てください)のように上記の拡張を作成すると、exeにあなたのlibsを見つける場所を伝えることができます。あなたは2つの選択肢があります。あなたのモジュールは、.exeがそれを見る場所にあります –