by shigemk2

当面は技術的なことしか書かない

コマンド名だけ指定してsubprocess.Popenでコマンド実行したときの挙動について

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のバージョンが表示される

悲しい。原因は?

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のこの問題は既知の問題で、既に解決されているものなんだろうねって思ったり思わなかったりしている。