Pythonをコンパイル

Pythonをコンパイルしますよ

なぜ?とかはどうでもいいです。
やってみたいのでやってみることにします。

準備

準備は、ほとんどありません。

sudo apt-get install python3-dev
とか
sudo yum install python36-devel
とか
apt-cyg install python3-devel
ですね。

SRCの変更、追加

LINUXでは、msvcrt が当然ないので、、
うぅーーん。どうしようかな。
ってことで、こんなん作りました。
なんかスマートじゃないな。
美しくするには、、どうすればいいんだろ。。

#-----------------------------------------
class	msvcrt:
	#---------------------------------------
	LK_NBLCK = 0
	LK_UNLCK = 0
	def locking(a,b,c):
		d = 0
	#---------------------------------------

あとは、Windowsでないときは、これをimport

if os.name != 'nt':
	import fcntl
	from msvcrt	import msvcrt

コンパイルするためのSRCファイルの作成

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize(['hiraFile.py']))

で、windowsの場合には、

python setup.py build_ext -i --compiler=mingw32 -DMS_WIN64

LINUXの場合には、

python3 setup.py build_ext -i

出来上がるファイル

windowsでは、こんなのが出来上がりました。

hiraFile.cp37-win_amd64.pyd

dependency walkerにかけると、依存しているPython関係は、
python37.dll
のみでした。
exportされてるのも、1つだけ。
PyInit_hiraFileだけですね。
まぁこれを通してポインタに関数テーブルとかであれこれやるんでしょ。きっと。(o^^o)

linux(centos)では、こんなのが出来上がりました。

hiraFile.cpython-36m-x86_64-linux-gnu.so

テストしてみます

呼び出すpythonを書いてみます

import time
from hiraFile	import hiraFile
if __name__ == '__main__':
	a = hiraFile()
	v = a.open(fn,"w")
	print("retV:",v)
	v = a.write("hiraide asdml.fnbq;pwerjkhpzoisdufa;ksemrnbq.m,wnrbpiouh")
	print("retV:",v)
	b = 0
	time.sleep(5)

これを、元のhiraFile.pyを削除して実行してみます。

疑問

なぜ、
from hiraFile import hiraFile
と書いただけで、

hiraFile.cp37-win_amd64.pyd
とか、
hiraFile.cpython-36m-x86_64-linux-gnu.so


とかが呼び出されるのかは、知らないです。

きっとうまくやってるんでしょう(o^^o)

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です