Racket:如何获取正在运行的文件路径?

8

我需要一种获取正在运行脚本的路径(包含源文件的目录)的方法,但是

(current-directory) 

它从未指向那里(在这种情况下是外部驱动器),而是指向某个预定义的位置。

我创建了一个文件来尝试所有“find-system-path”,但它们中没有一个是正在运行的文件!Racket文档没有帮助。

#lang web-server/insta
(define (start request)
  (local [{define (build-ul items)
       `(ul ,@(map itemize items))}
      {define (itemize item)
        `(li ,(some-system-path->string (find-system-path item)))}]
(response/xexpr
`(html
  (head (title "Directories"))
  (body (h1 ,"Some Paths")
        (p ,(build-ul special-paths)))))))

(define special-paths (list 'home-dir 
                        'pref-dir 
                        'pref-file 
                        'temp-dir
                        'init-dir 
                        'init-file 
                        ;'links-file ; not available for Linux
                        'addon-dir
                        'doc-dir 
                        'desk-dir 
                        'sys-dir 
                        'exec-file 
                        'run-file
                        'collects-dir 
                        'orig-dir))

这是为了一个本地Web服务器应用程序(音乐服务器),它将修改包含源文件的目录下的子目录。我将在USB存储设备上携带该应用程序,因此它需要能够定位自己的目录,以便我在安装有Racket操作系统的计算机之间移动。

2个回答

14

简单的方法:获取正在运行的脚本名称,将其转换为完整路径,然后获取它所在的目录:

(path-only (path->complete-path (find-system-path 'run-file)))

但是您更可能对包含代码的实际源文件感兴趣,而不是用于执行这些内容的文件(Web服务器)。也就是说,您希望一些资源靠近您的源代码。旧的做法如下:

(require mzlib/etc)
(this-expression-source-directory)

更好的方法是使用“runtime-path”,这是一种定义此类资源的方式:

(require racket/runtime-path)
(define-runtime-path my-picture "pic.png")

这样更好,因为它还将路径注册为您的脚本依赖的内容 - 因此,如果您将代码打包为安装程序,例如,Racket也会知道打包该png文件。

最后,您可以使用它指向整个目录:

(define-runtime-path HERE ".")
... (build-path HERE "pic.png") ...

@SquareCrow:关于您建议的编辑--它不是必需的,我在结尾提到的“HERE”定义正好可以做到这一点,而无需使用“path-only”。 - Eli Barzilay
当在DrRacket上运行时,(path-only (path->complete-path (find-system-path 'run-file)))无法正常工作。它会返回DrRacket的路径而不是所需的路径。 - Sorawee Porncharoenwase

0
如果您想获取绝对路径,我认为这应该可以做到:
(build-path (find-system-path 'orig-dir)
            (find-system-path 'run-file))

2
这个功能不可靠。使用 'run-file 时,find-system-path 返回 racket 可执行文件的路径,当以 racket <filename> 运行并作为脚本运行模块时返回 <filename> - Ha-Duong Nguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接