PYTHONビルド時の--enable-frameworkと--enable-sharedの違い
こんにちは、長男が今年もお泊まり保育でした。去年やって今年は2回目なので、こちらも去年ほどは心配せずのんびり過ごせるはずが、仕事に追われて、家路につく頃には長男はいつもは家では起きてる時間ですが、お泊まり保育の就寝時刻を過ぎていました@kjunichiです。
背景
Qiitaに
macOSでpyenvで入れたpythonをPyCallで使うには - Qiita
なる記事を投稿して、最近コメント頂いた。
macOSではPythonビルド時に--enable-frameworkなるオプションがあり、 自分の投稿したUnix的発想の--enable-sharedではなく、macOSの流儀に従ったオプションがあり、PyCall.jlの公式でも こちらのオプションが提示されていることを知った。
調査
とりあえず、やってみた
--enable-framework
- /3.5.3/Python.framework
といった感じで、pythonのインストールディレクトリ直下にPython.frameworkが出来る。
lib配下のlibpythonはframework内のファイルのシンボリックリンクとして作成される。
ls -l 3.5.3/lib lrwxr-xr-x 1 junichi staff 74 Jul 7 14:24 3.5.3/lib@ -> /Users/junichi/.pyenv/versions/3.5.3/Python.framework/Versions/Current/lib
2.7系だとpyenvで--enable-framework駄目かも。。。
どうも、2.7系だと最近の版は--enable-frameworkだとダメみたいでした。 軽くWebを検索する限り、過去にもどうも--enable-frameworkは問題起こしてるみたいでした。
Creating directory /Library/Frameworks/Python.framework/Versions/2.7/Resources/English.lproj install: mkdir /Library/Frameworks/Python.framework: Permission denied Creating directory /Library/Frameworks/Python.framework/Versions/2.7/lib install: mkdir /Library/Frameworks/Python.framework: Permission denied make: *** [frameworkinstallstructure] Error 71
--enable-fwamework=/Users/foo/libpath
を指定しても、
ln -fs "../../../Python" "/Users/junichi/.pyenv/versions/2.7.13/Python.framework/Versions/2.7/lib/python2.7/config/libpython2.7.a" ln: /Users/junichi/.pyenv/versions/2.7.13/Python.framework/Versions/2.7/lib/python2.7/config/libpython2.7.a: No such file or directory make: *** [frameworkinstallmaclib] Error 1
とエラーになってしまう。
※追記
実は、これ、pyenvで指定する環境変数がCONFIGURE_OPTSだとダメで、PYTHON_CONFIGURE_OPTSであれば、2.7系でもパスの指定も不要でインストール出来ました。
--enable-shared
Python.frameworkは作られず、Unix系な共有ライブラリのみ作成された。
macmini2014:versions junichi$ ls -l 2.7.13/lib/libpython2.7.dylib -r-xr-xr-x 1 junichi staff 2049716 Jul 7 16:37 2.7.13/lib/libpython2.7.dylib*
PyCall.jlを斜め読み
Python.frameworkを直接使用するコードは見当たらなかった。
using PyCall PyCall.libpython
で、lib配下のlibpythonxx.dylibを参照していることが判明。
結論
--enable-sharedでもJuliaからは問題なさそう。 ただ、どうせ、macOSで使うんだからPython.frameworkも作っておいた方が 後から役に立つ可能性があるかも。。。
2.7系は--enable-framework出来なければ、--enable-sharedで使うしかない。
関連記事
- #trouble #python3 pygtkのインストールにはまり中
- MavericksでもOpenCVでFaceTime HDカメラが動いた
- BaiduのIMEで俄然注目のmitmproxyをインストールしたらエラー #Solved
- 2014年大注目のFridaを動かした!
- シェルスクリプトのかわりにPythonでマルチプラットフォームで動かそうとして学んだこと
10年前の記事
5年前の記事
1年前の記事
2年後の記事
WindowsでDLLを作ろうとしてmrb_context_runの歴史を調べた
おはようございます。ここ数日夕方になると熱が上がる次男、昨日は夕方も熱も上がらず、汗かいて寝て、今朝も熱が上がらなかったので、おそらく復活かと思います。@kjunichiです。
背景
mruby-juliaなるmrubyからはJulia(PyCall経由でPythonも)を呼べ、JuliaからはmrubyのAPIにアクセスできるmrbgemを作ってます。
今年は、Windows環境がメインな環境であれこれ開発進めようとしていて、その際にmruby-sharedlibなるmrbgemを利用して、libmruby.a相当の mruby.dllを作ろうとしたら、defファイルのシンボル「mrb_context_run」が存在しないとうエラー。
mrb_context_runの歴史
1.0.0
mrb_context_runはmruby v1.0.0ではありました。
mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
1.1.0
MRB_API mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
1.2.0
MRB_API mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
current
#define mrb_context_run(m,p,s,k) mrb_vm_run((m),(p),(s),(k))
現在のmasterはこのように、mrb_vm_runを呼び出すマクロとして定義されています。 mruby-sharedlibでDLLを生成しようとしてdefファイルのシンボルが見つからないというエラーの 原因はこれでした。
まとめ
どうやら、現在のリリース版までは、存在しているようです。 単純にmruby-sharedlibにこのAPIを削除したプルリクを送るのは待った方がいいかもでした。
関連記事
- mrubyでselfを呼び出されたメソッドのインスタンスとして実行するには
- rubyの代わりにmrubyをつかう→はやくならなかったorz
- mrubyでPostgres.appを使って、LOBも扱ってみた
- mruby-juliaでPythonもmrubyから呼び出せるようになった
- TLで「mruby」を検索したらmrubyのコントリビュータになれた
- mrubyでaobenchを動かし、GIFアニメを出力できるようにした
- GPUを使って、mrubyでのaobenchを更に速くした
- mrubyでHTTP/1.1のKeep-Aliveで複数回リクエストを出してみた
- cordovaのプラグインを作ってkindle fireでmrubyを動かしてみた
- mrubyのFile.openをちょっと調べたメモ
- iOSでもCordovaプラグインを作ってmrubyを動かした
- Windowsでmruby-http2を動かした
- Julia言語からmruby-webcamを使ってWebカメラの画像を取得した
11年前の記事
4年前の記事
3年前の記事
2年前の記事
Ubuntuで/usrを消してsudoができなくなったが、レスキューモードでリカバれたが、mozcが動かなくて再インストールした件
こんばんは。かれこれ、半月以上は次男が熱を出して、ちょっと良くなって、また熱出してを繰り返しています。おそらく夏風邪の一種のようでとくに深刻な病気ではなさそうで、その証拠に、やたら食欲もあり、元気で扱いに困ってます。@kjunichiです。
背景
HDDの残量警告を頻繁に受けるようになり、/homeを別途用意したので、ついでに/usrを/homeの容量の空いているHDDへ コピーして
ln -s /home/usr /usr
して、この警告の回避を狙った。
やらかした
が、
rm -rf /usr してsudoコマンド使えないorz /usrは/home/usrにコピーしたもののハマった
— kjunichi (@kjunichi) 2017年6月23日
sudoが利用しているlibsudo_util.so.0が読み込めなかった LD_LIBRARY_PATHでコピーした先のパスを指定してもダメだった。
sudoコマンドはリカバリできたが。。
起動時に適当にキー叩いて、liloもとい、grubの選択画面が出てきて、ここで、レスキューモードで起動、 その後、rootのシェルでremountして/home/usrを/usrにシンボリックリンク張ってsudoコマンドは事なきを得た。
が、mozcがどうにも動かない、変換プログラムの軌道に失敗したから、再起動の一点張り。 ググるとすぐに~/.mozc配下のファイルを消せとあるが、効果なかった。
/usr消してsudoが使えなくなるトラブルはレスキューモードで操作して解消したが、mozcがなぜか使えなくなり、全然無駄に時間を使ってる
— kjunichi (@kjunichi) 2017年6月23日
HDDの容量を圧迫してた原因が判明
そもそものHDDの容量は/var/log/cups/error.logが原因だった。こいつが8Gも食っていた。 なぜそこまで肥大化したのかはおいおい調べることにする。
これに似た感じで最近UbuntuのHDDの残量がないなーとおもっていたらcupsのエラーログが8.1Gもあった / “12.04 - Log files (CUPS) grow so fast! - Ask Ubuntu” https://t.co/MY3FpP51QU
— kjunichi (@kjunichi) 2017年6月23日