ディレクトリ A とサブディレクトリ B があるとします。A に cd して Lisp を起動します。その Lisp プロセスで、Python が B を現在の作業ディレクトリと見なす Python サブプロセスを起動したいと思います。Lisp プロセスには A に cwd が必要であり、python プロセスには B に cwd が必要です。クロスプラットフォームで簡単な方法でこれを行うにはどうすればよいですか?
CCL と SBCL で動作し (おそらく 'run-program 関数を使用)、Windows、Linux、および OS X で動作するソリューションを探しています。
CCL 実行プログラムのドキュメントを見ましたが、起動されたプロセスの cwd を変更する方法がわかりませんでした。
Python コマンドライン引数を調べましたが、Python プロセスの cwd を変更するものは見当たりませんでした。
'cd B;' の実行プログラム呼び出しについて考えました。python ...' ですが、実際には 2 つのプログラムを実行しているため、それがどのように機能するかはわかりません。cd、次に python。
Python コードは入力として (ファイルとして) 提供されているため、そのコードを (os.chdir() 呼び出しなどを追加して) 変更することはできません。
Python入力ファイルをサブプロセスとして起動するPythonラッパーファイルは理想的ではありません。これは、標準入力を送信し、Lispによって起動されたPythonプロセスの標準出力をリッスンしているためです。Lisp と入力ファイルを評価する python プロセスの間に別のサブプロセスを追加するということは、多くの stout/stdin 中継を行う必要があることを意味し、これはもろくなると感じています。
krzysz00 のアプローチは非常にうまく機能しました。ディレクトリの変更は Lisp で処理されるため、python プロセスが起動される前に、このアプローチは別のサブディレクトリ (python だけでなく) で他のプロセスを起動するために機能します。
ドキュメントについては、SBCL と CCL で機能する krzsz00 のアプローチを使用した私のコードを次に示します。Hoyte の defmacro を使用していることに注意してください。Let Over Lambdaのマクロを使用して、不要な変数のキャプチャを簡単に回避できます。
#+:SBCL
(defun cwd (dir)
(sb-posix:chdir dir))
(defun getcwd ()
#+SBCL (sb-unix:posix-getcwd)
#+CCL (current-directory))
(defmacro! with-cwd (dir &body body)
`(let ((,g!cwd (getcwd)))
(unwind-protect (progn
(cwd ,dir)
,@body)
(cwd ,g!cwd))))
使用法:
(with-cwd "./B"
(run-program ...))