2.7.5でsubmodule.POpen
import subprocess cmd = "ruby --version" subprocess.Popen( cmd, shell=True ) cmd = "emacs --version" subprocess.Popen( cmd, shell=True )
期待される挙動
片方はrbenvで、もう片方は野良ビルドでビルドしたもので、環境変数は設定してあるから、上記のプログラムだとrbenvやら野良ビルドしたものやらのバージョンが表示されるはず。
実際の挙動
いずれも/usr/bin/の下のrubyとemacsのバージョンが表示される
悲しい。原因は?
@shigemk2 環境変数が引き継がれていない?
— なんつってつっちゃった (@masami256) 2015, 7月 12
@shigemk2 pathの検索順はPATHによるので、そこが引き継がれていなくて期待した動作になっていかなーと。
— なんつってつっちゃった (@masami256) 2015, 7月 12
@shigemk2 PATHの検索順はPATHの設定通りなはずです。なので、PATHがどうなってるのか表示させたほうが早いと思います。
— なんつってつっちゃった (@masami256) 2015, 7月 12
17.1. subprocess — サブプロセス管理 — Python 2.7ja1 documentation
たぶんPATHの設定が引き継がれていないのが原因ではないかなと。本当はソースコード本体を追っかけていくのが常道なのかもしれないけど、PATHの中身を見てもrbenvの設定は先頭の方に設定されているので、たぶん違うんじゃないかなって。
3.4.3でsubmodule.POpen
同じプログラムを3.4.3で試してみる。
import subprocess cmd = "ruby --version" subprocess.Popen( cmd, shell=True ) cmd = "emacs --version" subprocess.Popen( cmd, shell=True )
こんどはちゃんとうまくいく。
たぶん、subprocess.Popenのこの問題は既知の問題で、既に解決されているものなんだろうねって思ったり思わなかったりしている。