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

Calling a module does not work in Raku in Windows

我在目录 C:\Users\suman.

中有两个文件 main.rakuTestMod.rakumod

TestMod.rakumod

unit module TestMod;
sub add($a, $b) is export {
    $a + $b
}

main.raku

use lib $*PROGRAM.dirname;
use TestMod;

say add(8,9)

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

===SORRY!=== Error while compiling c:\Users\suman\main.raku
read from dirhandle failed: 123
at c:\Users\suman\main.raku:2

这是我的OS具体信息:

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

Rakudo 特定信息(从 rakudo.org 安装):

Welcome to Rakudo™ v2021.10.
Implementing the Raku® Programming Language v6.d.
Built on MoarVM version 2021.10.

但是这种情况在 Linux 中有效。见 MWE here.

它是 Windows 具体 issue/bug 还是我遗漏了什么?

尽管我在评论中说过,dirname 的行为很可能符合规范;只是它不在 return 特定于平台的名称的规范中。因此,调查什么 $*PROGRAM.dirname return 会很有趣。如果它是 Linux 格式的路径,那可能是问题的一部分。 这是 点:语法错误。 如果是这种情况,我们需要找到“正确”的语法。这就是为什么在这个答案的第一个版本中我指出使用 IO::Path::Win32 来创建该语法。其他选择可能是简单地手动输入目录名称。最后还是不能排除bug。

TL;DR 可能会帮助您找到答案的答案。

我知道什么?

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

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

read from dirhandle failed: 123

A google for "read from dirhandle failed: 123" 为我列出了两个匹配项。

一个是这样的。尽管我们正在努力,但我不确定这是否特别有用!


另一场比赛是:

githubmemoryhttps://githubmemory.com › ... · Translate this page
ohmycloud Profile - githubmemory

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

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

页面(我可以用 this URL; YMMV 看到)包含此匹配项:

when execute above script as Administrator, failed with read from dirhandle failed: 123

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


githubmemory.com 只是 GH 的副本。所以我发现它是 this issue 的副本。而那个更具有决定性。也就是issue opener ohmycloud 以结论结束:

It's actually a access deny error

嗯。真的吗?

请考虑从那个角度进行调查,并可能编辑您的问题以总结您的结论。但请先阅读,因为有理由怀疑是访问错误,如下

Windows系统错误123

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

我发现 read from dirhandle failed: 来自 MoarVM,显示错误代码来自 GetLastError(),我发现 来自Windows API,我到达了 this reference entry:

The filename, directory name, or volume label syntax is incorrect.

嗯。为什么 ohmycloud 谈论 access 错误?

我们或许应该尝试调查它是否“只是”无效的语法,而不是像访问错误这样的其他东西。

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

say $*PROGRAM.dirname.raku;
chdir $*PROGRAM.dirname;
say $*PROGRAM.dirname.IO.raku;

最后机会的大赔率黑马?

虽然更广泛地使用谷歌搜索(删除 123),但我发现了另一个可能感兴趣的匹配项。

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

this 2016 comment by nick cygx on the #moarvm channel

eventually dies with a SORRY: read from dirhandle failed: 123

这也在 Windows 上。由于错误消息,人们可以看出这一点,但它也在同一天晚些时候在 IRC 频道上得到确认:

that "read from dirhandle failed" thing happens inside a windows ifdefed block

Afaict,cygx 说他们在 bug Class fails to smartmatch against role defined in module.

中收到了测试用例的错误消息

jnthn 对此失败的回应是:

That...makes no sense o.O

(这是对您的 SO 的一个很好的总结。)


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

I've put off fixing up hyper/race for months already. :)


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


如果您可以尝试错误报告中的“最小测试用例”,将会很有帮助。你收到 123 错误了吗?

如果你这样做,那么也许(甚至更长的镜头)值得有人尝试与 cygx 取得联系吗?不幸的是 the nick cygx last appeared on #moarvm in 2019. So I did a google for cygx raku. I found an 8 month old comment about Raku under that nick from 8 months ago。 (我看到我的回复不当。对不起,cygx。)

@ugexe 的评论

他们的第一条评论是:

Pointing a use lib ... at [a directory containing] files your current user doesn't have access to isn't a good idea.

这表明您最好确保指向 lib 的目录是 而不是 诸如 C:\Users\suman 之类的目录,因为一般来说在这种情况下,这可能包括您的 Rakudo 编译器无法访问的文件。 (是否是这种情况取决于您的系统设置和您拥有的文件,但简单的解决方案是确保您仅将 lib 指向专用于 Raku 代码的目录。)


他们的最后一条评论(在此答案下方)是 link 到 a gist,行如下:

C:\Users\ugexe>raku --ll-exception -e "use lib '.'; use Test;"
read from dirhandle failed: 123
   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)
 from SETTING::src/core.c/Rakudo/Internals.pm6:1374
.
.
.

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

  • 显示它们产生相同的 Windows 系统错误 (123),除了 use Test;;

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

可能是读取权限的问题:read from dirhandle failed

在我的桌面上没问题:

raku .\main.raku
17

OS版本:Windows11专业(21H2)

乐版本:2021.10

  • .rakumod 文件移动到 C:\Users\suman 中的 separate folder 并使用 main 脚本中的 use lib "<separate folder>" 导入。

在我的例子中,当我将 TestMod.rakumod 移动到 C:\Users\suman\rakulib 并修改 main 脚本时,如下所示:

use lib "rakulib";
use TestMod;

say add(8,9)

有效。

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

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

file1.py

def add(a,b):
    return a + b

file2.py

from file1 import add

print(add(8,9))

所以我期待 raku 也一样。不幸的是,情况并非如此。

read from dirhandle failed 似乎像许多 rakoons 指出的访问拒绝错误。我很想知道我们如何从 raku 中解决这个问题。

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

将模块代码移动到它自己的文件夹中,例如(例如)rakulib,从主(调用)脚本向下一级。然后从主脚本调用模块:

主脚本:“Suman_main.p6”:

use lib "rakulib";
use SumanTestMod;


say add(8,9);

模块代码:“SumanTestMod.pm6”:

unit module SumanTestMod;
sub add ( $a, $b) is export {
    $a + $b
}

[答案改编自 Arne Sommer 的“Beginning Raku”一书中的代码,请参阅:https://arnesom.github.io/]