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的路径,如果模块作为脚本运行。