tonboです。
お世話になっています。
あるPCで動くpythonコードが他のPCでは動かないことがよく起こっています。
対策の最終目標は、pythonコードを64bit DLL化し、pythonの無い環境で、
Delphiから使用できるようにすることです。
ところが入り口で躓いています。
DLL化を実現できた方はみえますか?
【PC 開発環境】
Windows11、Delphi11、Python V3.9.13(venv)
【Pythonコード例】
他も試みましたが、裏付けなくやっているので省略します。
以下のadd関数をDelphiから使用したい。
1.add.pyx
# -*- coding: shift_jis -*-
cdef public int add(int a, int b):
return a + b
# -*- coding: shift_jis -*-
from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("add.pyx", compiler_directives={"language_level": "3"})
【コンパイラ】
2つでテストしました。
1.MSVC(Visual Studio 2022)
2.mingw-w64(msys2 でインストール)
【ビルド】
1.MSVC の時
>python setup.py build_ext --inplace
・add.cp39-win_amd64.pydができる。
2.mingw-w64 の時
>set PATH=C:\msys64\mingw64\bin;%PATH%
>set CC=gcc
>set CXX=g++ おまけ
としておいて、
2-1.
>python setup.py build_ext --inplace
・まだ、MSVCのcl.exeが使われている。
・add.cp39-win_amd64.pydができる。
2-2.
>python setup.py build_ext --inplace --compiler=mingw32
・エラー
【DLL のエクスポートシンボルの確認】
add.cp39-win_amd64.pydをadd.dllにリネームしておいて、
1.Dependencies
2.MSVC
>dumpbin /EXPORTS mylib.dll(Developer command prompt for ms2022 から実行)
3.MinGW-w64
>objdump -T mylib.dll
いずれも、add関数は見えません。
Pythonで行おうとすれば、冒頭のような様々な問題があります。
DLL化が手軽にできれば解決でき、Delphiの活用場面が増えます。
よろしくお願いします。
--
このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションを表示するには、https://groups.google.com/d/msgid/radstudio-jp/000001db889f%2419579770%244c06c650%24%40gmail.com にアクセスしてください。
久世様
早速のご返事、ありがとうございます。
(昼間は外出が多く、すみません)
P4Dですと、他のPCにもPython環境が必要で、環境が異なると、
動かないことが起こり得ます。
それを回避するため、Python環境不要なDLLを目標にしたいと思います。
Python不要にするために、Nuitkaでexeを作る方法もあります。
但しこの場合、Pythonコードで制御からGUIまで全て作る必要があり
非効率的です。
Nuitkaでも試したのですが、NuitkaではDLLは作れないようでした。
(先のメールのmylib.dllはadd.dllの間違いです。申し訳ありません)
---------------------
久世です。
Python for Delphi(P4D)ではダメなのでしょうか?
Delphiから、pythonコードを実行出来ます。
tonboです。
> PyInstallerは、Pythonスクリプトを実行可能ファイルに変換するツールとして知られていますが、DLLの作成にも使用できます。
> 依存関係を含めた完全なスタンドアロンDLLを作成できる点が特徴です。
----
伊藤様
情報ありがとうございます。
PyInstallerは知りませんでした。
試してみます。
このディスカッションを表示するには、https://groups.google.com/d/msgid/radstudio-jp/CA%2B3Kku-zmtxkZircPpoy1FTBGPNWX5Dy93uF4d5eSBkQmVnc2g%40mail.gmail.com にアクセスしてください。
伊藤様
情報ありがとうございます。
リンクの「サンプルコード4」をやってみました。
math_operations.exe は作れました。
Dllができないか試みましたができません。
ご報告します。
-----
Sent: Thursday, February 27, 2025 7:48 PM
試していないので全く自信はないのですが、 https://jp-seemore.com/iot/python/29750/#toc11 に書かれている方法はどうでしょうか?
> PyInstallerは、Pythonスクリプトを実行可能ファイルに変換するツールとして知られていますが、DLLの作成にも使用できます。
> 依存関係を含めた完全なスタンドアロンDLLを作成できる点が特徴です。
--
伊藤 賢治
2025年2月27日(木) 7:38
--
このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションを表示するには、https://groups.google.com/d/msgid/radstudio-jp/000001db8963%247036d190%2450a474b0%24%40gmail.com にアクセスしてください。
伊藤様
外出が続いていて申し訳ありません。
わざわざご確認いただき、ありがとうございました。
Nuitkaも試しました。
# -*- coding: shift_jis -*-
def add(a: int, b: int) -> int:
return a + b
2.ビルド
(1) >nuitka --modulee add.py
add.cp39-win_amd64.pyd ができましたが、add関数は外から見えませんでした。
(2) >nuitka --standalone add.py
add.exeはできましたが、dllはできませんでした。
add.py の中身を色々変えてみましたが駄目でした。
リンク先を拝見しましたが、駄目なようです。
なかなか難しいです。
------------------
--
このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションを表示するには、https://groups.google.com/d/msgid/radstudio-jp/003801db8a2c%24c43a70c0%244caf5240%24%40gmail.com にアクセスしてください。
伊藤様
>いろいろやってみましたが、pythonのコードをdll化するのは難しそうです。
ありがとうございます。お手数おかけしています。
この後、2点、確かめていきます。
運用時は大規模になるので、実行速度も重要になります。
ところで、伊藤様はCythonも確かめられましたか?yes、noで結構です。
私は、時間はかけましたが、表面的ですので。
--------------------------------------
いろいろやってみましたが、pythonのコードをdll化するのは難しそうです。他の方々がおっしゃっているように、python4delphiかEmbedded Pythonを使う方が楽で実行速度も速そうな気がします。
PS. Kawamata 様、全然気にしていません。Pythonは全くの素人なので。
> それと、先のメール、伊藤さんが紹介くださったPyInstallerを否定するような引用に
> なってました。伊藤さん、申し訳ありませんでした。
--
伊藤 賢治
2025年3月1日(土) 7:04
伊藤様
外出が続いていて申し訳ありません。
わざわざご確認いただき、ありがとうございました。
Nuitkaも試しました。
- add.py
# -*- coding: shift_jis -*-
def add(a: int, b: int) -> int:
return a + b
2.ビルド
(1) >nuitka --modulee add.py
add.cp39-win_amd64.pyd ができましたが、add関数は外から見えませんでした。
(2) >nuitka --standalone add.py
add.exeはできましたが、dllはできませんでした。
add.py の中身を色々変えてみましたが駄目でした。
リンク先を拝見しましたが、駄目なようです。
なかなか難しいです。
------------------
tonbo様
私も試してみましたが、pyinstallerではdllは作れないようです。
nuitkaを使ってdllを作れたというコメントを見ましたが、古いコメントなので今も有効かは分かりません。
--
伊藤 賢治
2025年2月28日(金) 7:03
--
このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションを表示するには、https://groups.google.com/d/msgid/radstudio-jp/001901db8ae5%240ad5cfd0%2420816f70%24%40gmail.com にアクセスしてください。
伊藤様
Tonboです。
そうでしたか。
Cythonも確かめていただき、本当にありがとうございます!
私も、「Cythonで単純なadd関数が外から見えないなんて、やり方がオカシイ」
と、2Wほどトライしましたが、私では無理でした。
これができると素晴らしいと思うのですが、Web上に動作例が見当たらないのは
不思議ですね。
-----------------------------
pyinstallerがダメと分かってからは 、ChatGPTを相手にCythonを重点的に試しましたが、dllは作れても関数をエクスポートさせることはできませんでした。
--
伊藤 賢治
2025年3月2日(日) 5:03
このディスカッションを表示するには、https://groups.google.com/d/msgid/radstudio-jp/CA%2B3Kku969K0vzoen%2Bw4PBZ2AV6CbqxgAtmFTX%2BBbL2MrD9z%3D3Q%40mail.gmail.com にアクセスしてください。
このディスカッションを表示するには、https://groups.google.com/d/msgid/radstudio-jp/002601db8af5%24e1005e80%24a3011b80%24%40gmail.com にアクセスしてください。
伊藤様
続けての情報、本当に助かります。
python4delphiは以前少し見た程度なので、いただいたURLで勉強から始めます。
進展がありましたらご報告いたします。
-----------
Pythonのような動的型付けを行う言語のコードをdll化して、C/Pascal のような静的型付けを行う言語から使う方法自体に無理があるのでは?と感じています。逆に Python を Delphi に埋め込んで使用する python4delphi ( https://github.com/pyscripter/python4delphi ) や Embeddable Python ( https://qiita.com/Koki_Takada/items/e8e01743576afe97d4ef )の方が柔軟性があって Python の強みを活かせると思います。python4delphi の使用例として、https://coding-tips-memoranda.com/how-to-use-python4delphi/ に懇切丁寧に書いてあって、大いに参考になりそうです。
--
伊藤 賢治
2025年3月2日(日) 7:04
伊藤様
tonboです。
教えていただいたhttps://coding-tips-memoranda.com/how-to-use-python4delphi/、
https://coding-tips-memoranda.com/how-to-use-python4delphi/等を参考に行ってみました。
結果、無事動作しました!
以下、変えたところや気付いた点です。
・Python4Delphi:Delphiの「Getitパッケージマネージャ」で、「Python4Delphi 1.0」をインストール。
・Embeddable Python:「python-3.9.13-embed-amd64.zip」をダウンロード。
・ライブラリのインストール:PC内にいくつかPython環境があり、Embeddable外に
インストールされたので、「Python -m」としました。
・python39._pth:いくつかインストールしたので、次のようになりました。要検討です。
python39.zip
.
Lib
Lib\site-packages
import site
・2番目のURLの「ノートPCの電池残量を表示するプログラムを作成」をやってみました。
電池のないPCではエラーが出るので少し変更。
strScrList.Add('import psutil');
strScrList.Add('btr = psutil.sensors_battery()');
strScrList.Add('if btr is not None:');
strScrList.Add(' var1.Value = str("残量:") + str(btr.percent) + str("%")');
strScrList.Add('else:');
strScrList.Add(' var1.Value = "バッテリー情報が取得できません"');
動作しました。
Embeddable PythonとP4Dの組み合わせ、いいですね!
これでPython環境のないどのPCでも手軽に実行でき、作り逃げできそうです^^
目的は達成です。
伊藤様、久世様、Kawamata様、ありがとうございました。
なお、CythonでのDLL化も、より高速化など必要な場面が出てきそうです。
今後、皆様の中で出来た方がみえましたら、紹介いただけると嬉しいです。
--------------------------
Sent: Sunday, March 2, 2025 8:01 AM
Subject: Re: [radstudio-jp:488] pythonコードをdll化しDelphiから使用したい
--
このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションを表示するには、https://groups.google.com/d/msgid/radstudio-jp/000401db8d50%2407b3de10%24171b9a30%24%40gmail.com にアクセスしてください。