假设我有一个名为A的目录和一个子目录B。我进入A并启动lisp。在这个lisp进程中,我想要启动一个Python子进程,其中Python将B视为其当前工作目录。lisp进程需要在A中拥有cwd,而python进程应该在B中拥有cwd。如何以跨平台、简单的方式实现这一点?
我正在寻找适用于CCL和SBCL(可能使用'run-program'函数)的解决方案,并适用于Windows、Linux和OS X。
我查看了CCL run-program文档,但没有看到更改启动进程的cwd的方法。
我查看了Python命令行参数,但没有看到可以更改python进程的cwd的参数。
我考虑运行'cd B; python...'的run-program调用,但我不确定它会产生什么效果,因为它实际上运行了两个程序;cd,然后是python。
Python代码被提供为输入(作为文件),因此我不能更改任何代码(例如添加os.chdir()调用或类似内容)。
启动Python输入文件作为子进程的Python包装器文件并不理想,因为我正在发送stdin并监听由lisp启动的python进程的stdout。在lisp和python进程之间添加另一个子进程来评估输入文件意味着我需要做大量的stdout/stdin中继,并且我有一种感觉这将是脆弱的。
krzysz00的方法非常有效。由于目录更改在启动Python进程之前在lisp中处理,因此这种方法适用于在不同子目录中启动其他进程(不仅限于python)。
以下是使用krzsz00的方法适用于SBCL和CCL的代码。请注意,它使用Hoyte的defmacro! 宏,来自Let Over Lambda,以轻松避免不需要的变量捕获:
我正在寻找适用于CCL和SBCL(可能使用'run-program'函数)的解决方案,并适用于Windows、Linux和OS X。
我查看了CCL run-program文档,但没有看到更改启动进程的cwd的方法。
我查看了Python命令行参数,但没有看到可以更改python进程的cwd的参数。
我考虑运行'cd B; python...'的run-program调用,但我不确定它会产生什么效果,因为它实际上运行了两个程序;cd,然后是python。
Python代码被提供为输入(作为文件),因此我不能更改任何代码(例如添加os.chdir()调用或类似内容)。
启动Python输入文件作为子进程的Python包装器文件并不理想,因为我正在发送stdin并监听由lisp启动的python进程的stdout。在lisp和python进程之间添加另一个子进程来评估输入文件意味着我需要做大量的stdout/stdin中继,并且我有一种感觉这将是脆弱的。
krzysz00的方法非常有效。由于目录更改在启动Python进程之前在lisp中处理,因此这种方法适用于在不同子目录中启动其他进程(不仅限于python)。
以下是使用krzsz00的方法适用于SBCL和CCL的代码。请注意,它使用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 ...))
cwd
是在每个线程上更改的? - Inaimathithread_safety(5)
,cwd
是每个线程的,但我并不完全确定。看看它是否有效。 - krzysz00