Path Racket:如何检索运行文件的路径?

Path Racket:如何检索运行文件的路径?,path,racket,Path,Racket,我需要一种方法来获取运行脚本的路径(包含源文件的目录),但是 不要指向那里(在本例中为外部驱动器),而是指向某个预定义的位置 我创建了一个文件来尝试所有的“查找系统路径”,但没有一个是正在运行的文件!勒索医生帮不了忙 #lang web-server/insta (define (start request) (local [{define (build-ul items) `(ul ,@(map itemize items))} {define (itemize

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

不要指向那里(在本例中为外部驱动器),而是指向某个预定义的位置

我创建了一个文件来尝试所有的“查找系统路径”,但没有一个是正在运行的文件!勒索医生帮不了忙

#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服务器应用程序(音乐服务器),该应用程序将修改包含源文件的目录下的子目录。我将在U盘上携带应用程序,因此当我在安装了Racket的机器和操作系统之间携带应用程序时,它需要能够找到自己的目录。

简单方法:获取运行脚本名称,将其放入完整路径,然后获取其目录:

(path-only (path->complete-path (find-system-path 'run-file)))
(define-runtime-path HERE ".")
... (build-path HERE "pic.png") ...
但是,您可能更感兴趣的不是用于执行内容的文件(web服务器),而是将代码放入其中的实际源文件。也就是说,你希望一些资源接近你的来源。较老的方法是:

(require mzlib/etc)
(this-expression-source-directory)
更好的方法是使用“运行时路径”,这是定义此类资源的一种方法:

(require racket/runtime-path)
(define-runtime-path my-picture "pic.png")
这更好,因为它还将路径注册为脚本所依赖的内容——因此,例如,如果要将代码打包为安装程序,Racket也会知道如何打包png文件

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

(path-only (path->complete-path (find-system-path 'run-file)))
(define-runtime-path HERE ".")
... (build-path HERE "pic.png") ...

如果您想要绝对路径,那么我认为应该这样做:

(build-path (find-system-path 'orig-dir)
            (find-system-path 'run-file))

@SquareCrow:这是您建议的编辑--不需要,我在最后提到的
这里的
定义正好做到了这一点,没有使用
仅路径
(仅路径(路径->完整路径(查找系统路径'运行文件))
在DrRacket上运行时不起作用。它返回到DrRacket的路径。这不可靠。使用
'run-file
查找系统路径
在使用
racket
运行时,返回可执行的
racket的路径,如果模块作为脚本运行。