LD_LIBRARY_PATHとPythonとPaiza.io問題あるいはpaiza.ioでmrubyを動かしhttp2通信する

  • 3
    Like
  • 0
    Comment
More than 1 year has passed since last update.

背景

Paiza.ioはネットワークにアクセス出来たり、ファイルが扱える。

って事は、Pythonのctypes経由でlibtrusterdが動かせるんじゃないか!

困ったこと

wgetっぽいことは案の定、Pythonで簡単に実装できた。

context = ssl.create_default_context()
conn = http.client.HTTPSConnection(host, 443, context=context)
conn.request('GET',path)
res = conn.getresponse()
f = open(libname, "wb")
f.write(res.read())
f.close()

たとえ、httpsでも簡単ですね™

libeventがpaiza.ioに無い!

まぁ、libtrusterd.soと同様にこれも持ってくればOK。

でも動かない。

tmlib.jsで有名な @phi さんがPythonの記事書いてたこと
この時初めて知ったけど、この記事のお陰で、
無事LD_LIBRARY_PATHに意図したパスを追加することに成功。

os.environ["LD_LIBRARY_PATH"] = os.environ.get("LD_LIBRARY_PATH") + ":."

でも、相変わらず動かない。。

じゃぁ、プロセス上げ直せばいいんじゃね

どうもdlopen時にはプロセスが起動された際の環境変数しか見てくれないっぽい。

さらに悪い事にpaiza.ioではプロセスを上げ直すと、少なくとも結果が出力されない!
もしかすると、子プロセスならうまくいく方法があるのかもだが、python経験の不足
の為、自分の書いたコードではNG。子プロセスの標準出力を親プロセスで吸い取れば
行けそうな気もしなくもないが。

dlopenのmanを思い出す

何度でも共有ライブラリをOpenできるが、2度目以降は実際にはロードしない旨の
記述があった気がして、それって、openしたライブラリ覚えてるってことかぁ。

予め、見つからないと言われる共有ライブラリをctypes.CDLLで呼び出して、
libtrusterdを実行した。

dummy = ctypes.CDLL("./libevent-2.0.so.5")
dummy = ctypes.CDLL("./libevent_core-2.0.so.5")
dummy = ctypes.CDLL("./libevent_openssl-2.0.so.5")

 大成功

まとめ

  • LD_LIBRARY_PATHはコード中で書き換えてもdlopen時には時既に遅し
  • 子プロセスや、プロセスの再立ち上げ出来ない状況下では、かたっぱしから、パスのとおっていない共有ライブラリをdlopenすればOK