Ptyhonのスクリプト内でcd(change dir)した際に、shellでもcdされている状態にしたいのですが、その方法を教えてください。


例えば、
/hoge/1/
にいる状態で、
python hoge.py
os.chdir('/hoge/2/');
としても、
shellに戻ると/hoge/1/にいるままだと思いますが、
/hoge/2/にいる状態にしたいのです。

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/05/06 10:08:58
  • 終了:2010/05/13 10:10:03

回答(2件)

id:JULY No.1

JULY回答回数966ベストアンサー獲得回数2472010/05/06 13:45:01

ポイント35pt

親プロセスとなるプログラム(この場合は、Python を呼び出したシェルプログラム)側に仕掛けを用意しないと無理だと思います。

シェル側の仕掛けを用意したやり方は、下記のページにありました。

教えて!Ziddyちゃん - Linuxのchdir(カレントディレクトリが移動できない)

Python ではなく、C で書かれていますが、

  1. 呼び出すシェル側の方で、trap を使ってシグナルを受け取るようにしておく。
  2. 呼び出される側は、ある特定のファイルに「cd /foo/bar」といった内容をファイルへ書き出して、親プロセスへシグナルを送る。
  3. シェルがシグナルをトラップし、ファイルの内容を実行する

という流れになります。

上記の例だと、親プロセスがシェルじゃなかったら、といった問題もありますので、もう少し工夫が必要だとは思いますが、何れにしても、呼び出す側にも仕掛けが必要なので、汎用的な手法とは言い難いです。

そもそも、カレントディレクトリはプロセス毎に保持しているものなので、もし、Python スクリプト中で変更したカレントディレクトリが、呼び出し元のシェルのカレントディレクトリに反映されるとなると、他のプロセスが保持しているデータを書き換える事ができる、という事を意味します。これが可能だとすれば、前述のように前もって双方に仕掛けを用意するか、カーネル自体に特別な仕掛けを作るしかないと思います。

id:t-wata No.2

t-wata回答回数82ベストアンサー獲得回数132010/05/06 14:07:36

ポイント35pt

http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel-6.html

これは不可能です。

あるプロセスから他のプロセスのcwdを変更することはできません。

シェルからpythonスクリプトを実行すると、シェルのプロセスの子プロセスとしてpythonプロセスができます。

親子プロセスとはいえ、それぞれ別々のプロセスになります。そのため、プロセス間通信以外では通信できません。

また、シェルのプロセスが親プロセスである場合、共有している標準入出力か、シグナル以外では子プロセスから

通信できないです。(または特定パスにあるファイルにメッセージを書いて伝える、とか)

いずれの場合もシェル側でハンドルするようにあらかじめなんらかの仕掛けが要ります。

trapでシグナル受け取り時の動作を定義しておくとか、コマンドの標準出力を読み取って、その内容に応じて何かを実行するとか。

普通にpython hoge.pyって実行するだけでcwdを変更することはできません。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません