人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: kunitz
●カテゴリ:コンピュータ インターネット
✍キーワード:CD chAngE CHDIR Dir hoge
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● JULY
●35ポイント

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

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

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

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

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

という流れになります。

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

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


2 ● t-wata
●35ポイント

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

これは不可能です。

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

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

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

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ