Allgemeines Lisp: Starten Sie den Unterprozess mit einem anderen Arbeitsverzeichnis als dem lisp-Prozess

Angenommen, ich habe ein Verzeichnis A und ein Unterverzeichnis B. Ich cd in A und starte lisp. In diesem lisp-Prozess möchte ich einen Python-Unterprozess starten, in dem Python B als aktuelles Arbeitsverzeichnis ansieht. Der lisp-Prozess muss cwd in A haben, und der Python-Prozess sollte cwd in B haben. Wie mache ich das auf plattformübergreifende, einfache Weise?

Ich bin auf der Suche nach einer Lösung, die mit CCL und SBCL (wahrscheinlich mit der Funktion 'run-program') funktioniert und für Windows, Linux und OS X funktioniert.

Ich habe mir die Dokumentation zum CCL-Ausführungsprogramm angesehen und keine Möglichkeit gefunden, die CWD des gestarteten Prozesses zu ändern.

Ich habe mir die Python-Befehlszeilenargumente angeschaut und keine gefunden, die den cwd des Python-Prozesses ändern würde.

Ich dachte an einen Programmaufruf für 'cd B; python ... ', aber ich bin mir nicht sicher, wie das funktionieren würde, da es wirklich zwei Programme ausführt; cd und dann python.

Der Python-Code wird als Eingabe (als Datei) bereitgestellt, daher kann ich diesen Code nicht ändern (indem ich einen os.chdir () -Aufruf oder ähnliches hinzufüge).

Eine Python-Wrapper-Datei, die die Python-Eingabedatei als Unterprozess startet, ist nicht ideal, da ich stdin sende und stdout des von lisp gestarteten Python-Prozesses anhöre. Das Hinzufügen eines weiteren Unterprozesses zwischen lisp und dem Python-Prozess, der die Eingabedatei auswertet, bedeutet, dass ich viel Stout / Stdin-Relaying ausführen muss, und ich habe das Gefühl, dass dies brüchig wäre.

Der Ansatz von krzysz00 hat sehr gut funktioniert. Da die Verzeichnisänderung in lisp behandelt wird, bevor der Python-Prozess gestartet wird, funktioniert dieser Ansatz zum Starten anderer Prozesse in verschiedenen Unterverzeichnissen (nicht nur Python).

Zur Dokumentation hier ist mein Code, der den Ansatz von krzsz00 verwendet, der für SBCL & CCL funktioniert hat. Beachten Sie, dass es Hoytes Defmacro verwendet! Makro, vonÜber Lambda lassen, um ungewolltes Erfassen von Variablen zu vermeiden:

<code>#+: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))))
</code>

Verwendungszweck:

<code>(with-cwd "./B"
  (run-program ...))
</code>

Antworten auf die Frage(3)

Ihre Antwort auf die Frage