3
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-26

背景

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

関連記事

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3