在 Windows 中的 Raku 中调用模块不起作用

Sum*_*nal 8 rakudo raku

我有两个文件main.raku,TestMod.rakumod位于一个目录中C:\\Users\\suman。

\n

TestMod.rakumod

\n
unit module TestMod;\nsub add($a, $b) is export {\n    $a + $b\n}\n
Run Code Online (Sandbox Code Playgroud)\n

main.raku

\n
use lib $*PROGRAM.dirname;\nuse TestMod;\n\nsay add(8,9)\n
Run Code Online (Sandbox Code Playgroud)\n

我想TestMod从main脚本文件调用模块中的一些函数。当我运行脚本时,我收到此错误

\n
===SORRY!=== Error while compiling c:\\Users\\suman\\main.raku\nread from dirhandle failed: 123\nat c:\\Users\\suman\\main.raku:2\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的操作系统特定信息:

\n
Host Name:                 SUMANKHANAL\nOS Name:                   Microsoft Windows 10 Pro\nOS Version:                10.0.19043 N/A Build 19043\nOS Manufacturer:           Microsoft Corporation\nOS Configuration:          Standalone Workstation\nOS Build Type:             Multiprocessor Free\nRegistered Owner:          N/A\nRegistered Organization:   N/A\nProduct ID:                00331-20350-00000-AA867\nOriginal Install Date:     10/19/2020, 3:36:49 PM\nSystem Boot Time:          12/7/2021, 1:00:40 PM\nSystem Manufacturer:       Dell Inc.\nSystem Model:              Inspiron 5379\nSystem Type:               x64-based PC\nProcessor(s):              1 Processor(s) Installed.\n                           [01]: Intel64 Family 6 Model 142 Stepping 10 GenuineIntel ~1792 Mhz\nBIOS Version:              Dell Inc. 1.17.0, 8/18/2021\nWindows Directory:         C:\\WINDOWS\nSystem Directory:          C:\\WINDOWS\\system32\nBoot Device:               \\Device\\HarddiskVolume1\nSystem Locale:             en-us;English (United States)\nInput Locale:              en-us;English (United States)\nTime Zone:                 (UTC+05:45) Kathmandu\n
Run Code Online (Sandbox Code Playgroud)\n

Rakudo 具体信息(从 rakudo.org 安装):

\n
Welcome to Rakudo\xe2\x84\xa2 v2021.10.\nImplementing the Raku\xc2\xae Programming Language v6.d.\nBuilt on MoarVM version 2021.10.\n
Run Code Online (Sandbox Code Playgroud)\n

然而,这种情况在 Linux 中是有效的。请参阅此处的MWE 。

\n

这是 Windows 特定问题/错误还是我遗漏了什么?

\n

rai*_*iph 6

长话短说一个可能会帮助您找到答案的答案。

\n

我知道什么?

\n

不是很多。我已经很多年没有使用 Windows 进行开发了。我以前没有见过这个错误。

\n

我只是决定看看我能找到什么。我发现了一些东西,阅读了字里行间的内容,然后……最终得到了这个答案。

\n

read from dirhandle failed: 123

\n

谷歌搜索“从 dirhandle 读取失败:123”为我列出了两个匹配项。

\n

其中之一就是这样。尽管我们正在努力,但我不确定这是否特别有帮助!

\n
\n

另一场比赛是:

\n
\n

githubmemoryhttps://githubmemory.com \xe2\x80\xba ... \xc2\xb7 翻译此页面 \xe2\x8b\xae
\nohmycloud 简介 - githubmemory

\n
\n

当我点击它时,它没有我搜索的错误消息。

\n

但是单击\xe2\x8b\xae会显示一个About this result弹出窗口,并且cache该弹出窗口底部的一个按钮链接到搜索匹配的页面的早期版本。(这是一个通用技巧,用于了解搜索结果何时不包含您刚刚搜索的内容。)

\n

还有那个页面(我可以通过这个 URL看到它 YMMV)包含此匹配项:

\n
\n

当以管理员身份执行上述脚本时,失败read from dirhandle failed: 123

\n
\n

但这还不是决定性的。嗯。

\n
\n

githubmemory.com只是 GH 的副本。所以我发现这是这个问题的副本。然后​更具决定性的。也就是说,问题的开场白 ohmycloud 以以下结论结束:

\n
\n

这实际上是一个访问拒绝错误

\n
\n

嗯。真的吗?

\n

请考虑调查这个角度,也许编辑你的问题来总结你的结论。但请先继续阅读,因为有理由怀疑这是访问错误,如下所示。

\n

Windows系统错误123

\n

我的下一个研究角度是确定错误代码的确切含​​义。

\n

我发现它read from dirhandle failed:来自 MoarVM,这表明错误代码来自GetLastError(),我发现它来自 Windows API,我找到了这个参考条目:

\n
\n

文件名、目录名或卷标语法不正确。

\n
\n

唔。为什么ohmycloud要讲访问错误?

\n

我们也许应该尝试调查是否是这样只是”无效语法而不是其他诸如访问错误之类的东西。

\n

请尝试以下操作,并考虑是否值得将一些结果(至少其中一个)粘贴到您的问题中:

\n
say $*PROGRAM.dirname.raku;\nchdir $*PROGRAM.dirname;\nsay $*PROGRAM.dirname.IO.raku;\n
Run Code Online (Sandbox Code Playgroud)\n

最后机会大胜黑马?

\n

在更广泛地搜索(放弃123)时,我发现了另一个可能感兴趣的匹配项。

\n

(它实际上确实有同样的错误,所以我不明白为什么我尝试的第一个谷歌没有列出它,但无论如何。)

\n

这是nickcygx在 #moarvm 频道上于2016 年发表的评论

\n
\n

最终因 SORRY: read from dirhandle failed: 123 而死亡

\n
\n

Windows 上也是如此。人们可以从错误消息中看出这一点,但当天晚些时候也在 IRC 频道上确认了这一点:

\n
\n

“从 dirhandle 读取失败”的事情发生在 Windows ifdefed 块内

\n
\n

事实上,cygx 表示他们在错误Class isn't smartmatch against role Defined in module中收到了测试用例的错误消息。

\n

jnthn对此失败的响应是:

\n
\n

这……毫无意义oO

\n
\n

(这是对你的SO的很好的总结。)

\n
\n

jnthn 还说了关于 cygx 错误的另一件事:

\n
\n

我已经把修复 hyper/race 的事情推迟了好几个月了。:)

\n
\n
\n

所以,也许,或者更抒情地作为最后一次机会远投黑马,也许MoarVM 的内部存在一些hyper/相关的问题,这些问题在 Windows 上与模块加载相关?race

\n
\n

如果您可以尝试错误报告中的“Minimal testcase\xe2\x80\x8b”,将会很有帮助。你明白123错误了吗?

\n

如果你这样做了,那么也许(甚至更长的时间)值得有人尝试与 cygx 取得联系?不幸的是,这个昵称cygx最后一次出现在 #moarvm 上是在 2019 年。所以我用谷歌搜索了一下cygx raku。我在 8 个月前的昵称下发现了一条关于 Raku 的 8 个月前的评论。(我发现我的回答不恰当。对不起,cygx。)

\n

@ugexe 的评论

\n

他们的第一条评论是:

\n
\n

指向use lib ...当前用户无权访问的[包含]文件的目录并不是一个好主意。

\n
\n

这表明您最好确保您指向的目录lib不是一个目录,因为C:\\Users\\suman在一般情况下,该目录可能包含 Rakudo 编译器无法访问的文件。(是否属于这种情况取决于您的系统设置以及您拥有的文件,但简单的解决方案是确保您仅指向libRaku 代码专用的目录。)

\n
\n

他们的最后一条评论(在这个答案下面)是一个指向要点的链接,其中的行如下:

\n
C:\\Users\\ugexe>raku --ll-exception -e "use lib \'.\'; use Test;"\nread from dirhandle failed: 123\n   at SETTING::src/core.c/Rakudo/Internals.pm6:1345  (C:\\Users\\ugexe\\.rakudobrew\\moar-2021.10\\install\\share\\perl6\\runtime/CORE.c.setting.moarvm:next)\n from SETTING::src/core.c/Rakudo/Internals.pm6:1374\n.\n.\n.\n
Run Code Online (Sandbox Code Playgroud)\n

我不知道如何解释这个要点,但我可以看出他们的要点:

\n
    \n
  • 显示它们产生相同的 Windows 系统错误 ( 123),除了use Test;;之外什么都没有。

    \n
  • \n
  • 显示如果传递到 Windows,可能在语法上无效的路径 ( C:\\Users\\ugexe\\.rakudobrew\\moar-2021.10\\install\\share\\perl6\\runtime/CORE.c.setting.moarvm:next)。我的猜测是它们没有传递到 Windows,而是只是以这种方式构建作为显示错误的一部分。但这只是一个猜测。

    \n
  • \n
\n

  • https://gist.github.com/ugexe/b1b72ed0fd57069ff5533dfc03a95532 (2认同)
  • https://gist.github.com/ugexe/90b63ea9e33f406f977c970d138bbc9d - 看起来可能与“我的视频”类型文档文件夹/链接相关 (2认同)

Sum*_*nal 6

  • .rakumod将文件移动到separate folder内部C:\Users\suman并use lib "<separate folder>"从main脚本导入是可行的。

就我而言,当我移动TestMod.rakumod并C:\Users\suman\rakulib修改main脚本时,如下所示:

use lib "rakulib";
use TestMod;

say add(8,9)
Run Code Online (Sandbox Code Playgroud)

有用。

  • 也可以将这两个文件移动到Desktop。

但我觉得很奇怪!因为python与我的问题类似的两个文件工作正常,没有任何问题,即使它们都在文件夹中C:\Users\suman。

file1.py

def add(a,b):
    return a + b
Run Code Online (Sandbox Code Playgroud)

file2.py

from file1 import add

print(add(8,9))
Run Code Online (Sandbox Code Playgroud)

所以我也期待同样的事情raku。不幸的是事实并非如此。

read from dirhandle failed正如许多 rakoons 指出的那样,这似乎是访问拒绝错误。我很想知道我们如何从 raku 内部解决这个问题。

致谢:@jubilatious1 和@chenyf 提出的想法有效。所以我在这里把它们结合起来。