pythonを使って動的リンクライブラリdllを作成する方法


今、深さの学習の発展に従って、pythonはすでに深さの研究の中で第1言語になりました。ほとんどの深さ学習キットはpythonのバージョンがあります。多くの重要なアルゴリズムはpythonバージョンの実装があります。これらのアルゴリズムを特定の工程に適用するために,これらのツール・バッグも異なるタイプのインターフェースを提供した。
ダイナミックリンクライブラリ(.dll,so)はシステム開発において非常に重要なクロス言語協力方式である。python言語で作成したアルゴリズムをダイナミックライブラリにコンパイルして、他の言語への呼び出しを提供することができます。これはアルゴリズムの開発効率を大幅に高めることができます。
しかし、pythonは他の言語で生成されたダイナミックライブラリを呼び出すことができますが、pythonはスクリプト言語として、直接コンパイルしてダイナミックライブラリを生成することはできません。ダイナミックライブラリを生成するために、cythonを使って、pythonスクリプトをc言語ファイルに変更します。具体的な過程を簡単な例で説明した。

def str_add(str1,str2): 
    return int(str1) + int(str2)
このコードは、2つの数字からなる文字列を数字に変換し、合計を求めます。私たちはこのコードをrun.pyの予備として保存します。cythonの文法に基づいてcythonバージョンの関数を与えた。

cdef public str_add(str1,str2):
     return int(str1) + int(str2)
前のpythonバージョンと比較して、cdefはdefを交替して、publicキーワードを加えて、この関数が導出されることを表しています。このコードをpyxファイルに保存します。例えば、run.pyxです。
次に、私達は次のコマンドを実行して、このコードをc言語バージョンに変えます。
cython run.pyx
この時、ディレクトリの下からrun.hとrun.cの二つのファイルが生まれます。この二つのファイルはpythonのC-APIを呼び出すことによって、run.pyコードの機能を実現します。
次に、ダイナミックライブラリのメインファイルdlmail.cを作成します。

#include <Python.h>
#include <Windows.h>
#include "run.h"
 
extern __declspec(dllexport) int __stdcall _str_add(const char * a, const char * b) {
  return PyLong_AsLong(str_add(PyUnicode_FromString(a),PyUnicode_FromString(b)));<br data-filtered="filtered">
}
 
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved) {
  switch( fdwReason ) {
    case DLL_PROCESS_ATTACH:
      Py_Initialize();
      PyInit_run(); #dll        ,  python3   ,python2  ,initrun()。     run.h
      break;
    case DLL_PROCESS_DETACH:
      Py_Finalize();
      break;
  }
  return TRUE;
}
このファイルはエクスポート関数(u)を定義しています。straddpythonでは、すべてのデータをpyobjectで保存します。この関数はPyUnicode_を通しています。FroomStringは、2つの文字列をpythonオブジェクトタイプに変えて、run.hの中の関数str_を呼び出します。addは和を求め、結果をPyLong_に通す。Aslong関数はpythonオブジェクトから整形数字になります。
私たちはこのコードを下記のコマンドでコンパイルしてdllを生成できます。
cl/LD dl mail.cn-IC:\python 36\include C:\python 36\libs\python 36.lib
ここでpythonのルートは、パソコンのpythonの設置位置によって調整されます。
作成したdllは簡単な呼び出しを書いてテストします。

#include "stdio.h"
#include "stdlib.h"
extern __declspec(dllexport) int __stdcall _str_add(const char * a, const char * b);
 
#pragma comment(lib,"dllmain.lib")
 
int main()
{
 printf("%d 
", _str_add("123","456")); return 0; }
出力結果:579、ちょうど123+456に等しい。
以上の手順により、pythonコードの実現機能をダイナミックライブラリにパッケージすることができました。しかし、このダイナミックライブラリはpythonがインストールされていないマシンの上では動作しません。実際には、pythonコードは、通常多くの依存性が必要です。また、セグメントコードごとに必要な依存性のカバンは異なります。これらのカバンを探すために、もう一つのツールを採用します。具体的な手順は以下の通りです。
Virtualnv envpack↉は新しい環境を作ります。pythonパッケージ依存は複雑です。新しい環境を作ると最終的に導入されたカバンを減らすことができます。
cd envpack〓が目次に入ります。
このカタログには、ヒドイコピーrun.pyが必要とされるカバンは、最終的にdllが必要とするカバンと同じです。
Script s\activate葃をアクティブにしてvirtualnv環境に切り替えます。
pip install pyinstaller〓包装ツールpyinstallerをインストールします。
pip install numpyや他のスクリプトをインストールするために必要なライブラリは、あなたのimportを参照してください。
pyinstaller run.py钾包装コマンド
Scrippts\deactivate葃包装成功後、コマンドで環境の活性化をキャンセルします。
パッケージが必要なファイルはenvpack\distにたくさんあります。dllと.pydファイルはこれらのファイルをdllと一緒にリリースすればいいです。
締め括りをつける
ここではpythonを使って動的リンクライブラリdllを生成する方法についての記事を紹介します。python動的リンクライブラリdllの内容については以前の記事を検索したり、下記の関連記事を引き続き閲覧したりしてください。これからもよろしくお願いします。