私はディレクトリAとサブディレクトリBがあるとします。私はAにcdしてlispを起動します。このリスププロセスでは、Pythonのサブプロセスを起動したいと思います。ここで、PythonはBを現在の作業ディレクトリと見なします。 lispプロセスはAでcwdを持つ必要があり、PythonプロセスはBでcwdを持つべきです。これをクロスプラットフォームで簡単な方法でどうやって行うのですか?Common Lisp:lispプロセスとは異なる作業ディレクトリでサブプロセスを起動します
私はCCLとSBCL(おそらく使用して「実行プログラム機能)で動作し、WindowsやLinuxのために働く、とOS Xのソリューションを探しています私はCCL実行プログラムを見て私は、起動したプロセスのcwdを変更する方法を見ていませんでした。
私はPythonコマンドライン引数を見ましたが、Pythonプロセスのcwdを変更するものはありませんでした。
「cd B」の実行プログラム呼び出しについて考えました。 python ... 'が、実際には2つのプログラムを実行しているので、どのように動作するのか分かりません。 cd、そしてpythonを実行します。
Pythonコードが入力として(ファイルとして)提供されているため、そのコードを変更することはできません(os.chdir()呼び出しを追加するなど)。
python入力ファイルをサブプロセスとして起動するpythonラッパーファイルは理想的ではありません。なぜなら私はstdinを送信し、lispによって起動されたpythonプロセスのstdoutを聞いているからです。 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 ...))
素敵な提案;ありがとう。私は外部プログラムの互換性レイヤーを使用しませんでした。b/c私はsbclとcclに必要なのですが、それらの実行プログラムは基本的に同じですが、このコードのパッケージを簡単にロードできません。サーバー側で使用されていません。 –
マルチスレッドプログラムには何か意味がありますか、またはスレッドごとに 'cwd'が変更されていますか? – Inaimathi
私は 'cwd'が' thread_safety(5) 'の素早いスキムからスレッドごとだと思っていますが、完全にはわかりません。それが動作するかどうかを確認します。 – krzysz00