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)