New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Debian系のLinuxでPython 2.xと3.xが同時利用できない問題の原因と対策 #301
Comments
できると思いますよ。問題の事例とこうなってほしいという例が頂きたいです。
これは数字がどこかにあったりしますかね?あると説得しやすいです。 |
「Vim から Python 2 とPython 3 の同時利用ができない」 というのがこのIssueで提示できる問題です。 :py print(sys.version)
2.7.3 (...
:py3 print(sys.version)
E837: ... もしくは :py3 print(sys.version)
3.3.0 (...
:py print(sys.version)
E836 となってしまいますが :py print(sys.version)
2.7.3 (...
:py3 print(sys.version)
3.3.0 (... こうなって欲しいと言えます。が、あまりに一般性に欠けるとも思います。
私は持っていませんが、ちょっと聞いてみます。 |
過去のchangelogみたらpystoneというので測ってたようなので、それを使えばいいかもしれませんね。 |
一応公式ドキュメントに記載されていますが、もっと詳しくということでしょうか。 |
各プラグインを使う人向けの文章もしくは記事が欲しい、と捉えてください。 指摘のドキュメントは if_python を使ってプラグインを書く人は読むでしょうが、 |
https://gist.github.com/4681131 |
@methane Thanks! ところでこれの読み方は
ってことで良いですか? |
うげ。FreeBSDには shared 版と static 版、両方のpythonコマンドがインストールされてるっぽいw |
https://gist.github.com/4681320 32bit はかなり遅いのね。やっぱディストリに働きかけるのはむりっぽい数字だわw |
ubuntu は --enable-shared なってませんか $ python -c 'import distutils.sysconfig; print(distutils.sysconfig.get_config_var("CONFIG_ARGS"))' |
Ubuntu 13.04 64bit で --enable-shared になってることを確認 |
別途、Issueを立てたほうが良いのかもしれませんが、とりあえずここに追記します。 先ほど、Ubuntu 12.04.2 LTSで、自前でビルドした 少し急ぎだったので、 もし既知の問題でなければ、どなたか追試をお願いできないでしょうか? 発生したエラーの具体的な内容は今すぐはちょっと確認できないので、後でコメントを追加します。 |
下記が、
先ほど書き忘れたのですが、OSはUbuntu 12.04.2 LTSの64ビット版、Vimは7.4b.022です。 |
@msmhrt まさにこの issue の問題で、 Python 2 と Python 3 で名前がぶつからないように vim がlibpythonXY.so を読み込むときに読み込み元の名前が見えないようにしています。それが Python の拡張モジュール |
13.04 で試してみましたが、やはり python コマンドは libpython を利用していません。
Python コマンドと libpython で同一の拡張モジュールを利用するために、拡張モジュールが libpython に依存していないのも変わってません。
|
libpython を static link する場合は vim のリンク時に -export-dynamic を付ければいけると思います。 |
Vimのconfigureを、 ちなみに、 |
つまり autoconf 関連を直すか、http://vim-jp.org/docs/build_linux.html ここの記述に追加したほうが良い感じですか? |
あ、「問題なきことを確認」というのは、 |
すみません。一点確認させてください。 |
両方使う場合は必ず /dyn になります。 |
@msmhrt Python 2.7 で time を import できるのは、 time が Python 2.7 では extension module ではなくて builtin module だからだと思います。 datetime などではやっぱりダメなんでは無いでしょうか? /usr/lib/python2.7/lib-dynload/ や /usr/lib/python3.3/lib-dynload/ のなかにあるモジュールで確認しないといけません。 |
ubuntu の python のパッケージは --enable-shared 付きなので今の記述で大丈夫と思います。debian はわかりません。 |
@ynkdir Thanks! そうなると autoconf で検出して正しくconfigureできると良さそうですね。 |
Ubuntu 14.04 で http://vim-jp.org/docs/build_linux.html とほぼいっしょな方法でビルドした場合、やはり同時ロードできてないっぽい。 なんか必要な作業ありましたっけ? |
diff --git a/src/auto/configure b/src/auto/configure
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -6352,6 +6352,8 @@
CFLAGS="$CFLAGS $PYTHON_CFLAGS"
ldflags_save=$LDFLAGS
LDFLAGS="-ldl $LDFLAGS"
+ libs_save=$LIBS
+ LIBS="$LIBS -ldl"
if test "$cross_compiling" = yes; then :
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -6410,6 +6412,7 @@
CFLAGS=$cflags_save
LDFLAGS=$ldflags_save
+ LIBS=$libs_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can do without RTLD_GLOBAL for Python3" >&5
$as_echo_n "checking whether we can do without RTLD_GLOBAL for Python3... " >&6; }
@@ -6417,6 +6420,8 @@
CFLAGS="$CFLAGS $PYTHON3_CFLAGS"
ldflags_save=$LDFLAGS
LDFLAGS="-ldl $LDFLAGS"
+ libs_save=$LIBS
+ LIBS="$LIBS -ldl"
if test "$cross_compiling" = yes; then :
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -6476,6 +6481,7 @@
CFLAGS=$cflags_save
LDFLAGS=$ldflags_save
+ LIBS=$libs_save
PYTHON_SRC="if_python.c"
PYTHON_OBJ="objects/if_python.o" Ubuntu ではこれでいけると思います。 |
ポイントは「configure時に-ldl を付けること」ではなく、 あっているならばそのオプションを教えてください。 |
python2.7-dev ではなく python-dev の方には python2-config が入っているようです。 |
configure.in:3854 以降の "dnl Check for dynamic linking loader" のブロックって実は、python*/dyn のチェックより前にやるべきな気が。そうすれば "-ldl" の細工は不要になりそう? |
ちなみに、僕が確認したサーバ(借り物)には |
python2-config があったらそれ使う。なかったら今のままの値を使う。 程度の修正で、ubuntuが救えれば良いと思ってます。 |
すみません、これってどういう意味でしょうか? |
で示してもらったパッチは、既存の「RTLD_GLOBAL が必要かどうかを判断する」 しかし新たに「UbuntuならばRTDL_GLOBAL が必要かどうかを判断する」 |
それはそうなんですが、ld のデフォルトオプションが原因なので 根本の原因は |
私は「場当たり的な」パッチの、受け入れられやすい代替案を示したのです。 |
ついでに正しい解決策について言えば、 いまある問題の本質は |
いや、libpython*.so を |
それは本issueのスコープではありません。 |
仮に「python関係ない」が真ならば それを踏まえて
ということです。 |
|
Ubuntu 14.04 64bit で確認してみました。 Python 2.7, 3.4 ともに configure 未修正のまま、configure を実行すると、
の表示。config.log を確認すると、conftest.c に 次に、configure をいじって、
の表示。config.log を確認すると、今度はリンクは成功しているが、
の表示。 これは結局、モジュールが |
はい、おっしゃる通りです。恐らくは、
のように表示されると思いますのでご確認ください。 これがもし
のように |
なるほど、
でした。 |
そういえば、 ※※※ 以下、単なる愚痴です ※※※ もしそうなっていれば、
|
実行ファイル版の python を --enable-shared=no でビルドして速度を稼いでるので、 なので、 python-config 等を使うのではなくて、実際に RTLD_GLOBAL 無しで |
@msmhrt Python 自体のビルドシステムはこんな変態的な構成をサポートしていません。 |
こうなる環境は存在しますか? |
OS Xの場合、configureは、RTLD_GLOBAL不要と判断するので、
UNIXがdefineされてる環境で、py, py3が同時に動く環境て存在しますか? OS Xだけが特殊なんでしょうか? PY_NO_RTLD_GLOBALとかをundefすれば、SEGV受けずには済みますが。
|
Linuxでは python2/3 ともに --enable-shared でビルドしておけば両方同時に使えるという結論でした。(私自身は試していませんが。) |
私が試した範囲では、Linux, Solaris は py/py3 の同時利用が可能です。
OS X というか、OS X での python モジュールのビルド設定が原因です。 python の各モジュール そのため、Vim が libpython (2.x) と libpython3 両方をロードした場合、python モジュールが「どちらの lib にも含まれる関数」を呼び出そうとした際には、自分のバージョンに合致した lib を選択することはできず、先にロードされた lib の関数を呼ぶことになります。 具体的には、
各モジュールのビルド時に、linkage 情報 ( [追記] |
ありがとうございます。 otool -Lで何かを確認できるなら、Vimのpython_loadedあたりでプログラム的に同じことをして、SIGSEGVせずに、py→py3もしくはpy3→pyを拒否したい。
|
python3 の場合、otool でモジュールの状態を確認すると以下のようになります。 デフォルト (libSystem.B.dylib のみリンク)
py→py3 で同時利用可能 (Python (libpython3) がリンクされている)
...を確認できれば良いかと思います。 |
ありがとうございます。しかし、考えてみると、どのsoファイルが読み込まれるかわからないのではないかという結論に達しました(dlopenがどのdylibを読むかわからない(DYLD_FRAMEWORK_PATHとか使ってdlopenの挙動を再実装するとか)、dylibが特定できてもどのsoファイルを読みに行くかわからない(いろいろやればできなくもないでしょうけど))。MacVimはconfigureいじって、PY*_NO_RTLD_GLOBAL=0になるようにしてしまいます。 |
あやしげなconfigureオプションを追加してみました macvim-dev/macvim#181 |
同時使用に成功しました https://gist.github.com/splhack/4ec93591aec286beac496bbd5cc8d764 2も3もPYTHONHOME環境変数に依存してるので、どうしたもんだろうかと思ったんですが、一旦初期化してしまえば、問題なしぽいですね。 |
Ubuntu はデフォルトは Python 3 にして、 Python 2 を使いたい人は vim-nox-py2 などを 一番重要そう(かつ開発者が Python 3対応に消極的)だった YouCompleteMe がもう Python 3 に対応したので、 |
本家で同様の話題が出ていた (vim/vim#1504) ので、ここでのやりとりを元にコメントをしておきましたが、Debian/Ubuntu がどうやってビルドしているのかをちゃんと把握していないので間違ったことを書いていないか心配…。 |
Ubuntuを始めDebian系のLinuxでPython 2.xと3.xが同時利用できません。
直接の原因はPythonがstatic linkで作られるのと同時に.soも提供されているからです。
Pythonが利用するモジュールはstatic linkでPythonに繋がるのに、
Vimは.soのほうに繋がるのでdlopenにRTLD_GLOBALが設定されてないと、
それらのモジュールを正しくロードできずに落ちてしまいます。
過去のvim-devの議論によれば「 落ちるよりは使えないほうがマシ 」と結論され
現在に至ったようです。
一番簡単な解決方法は、Pythonと関連モジュール一式を --enable-shared でコンパイルし直すことです。
デメリットは x86(32ビット)系で遅くなる ことですが、どうやら 64ビットではそのデメリットは無さそう です。
で本Issueのポイントは以下のとおりです:
The text was updated successfully, but these errors were encountered: