在 Windows 中调用模块在 Raku 中不起作用
Calling a module does not work in Raku in Windows
我在目录 C:\Users\suman
.
中有两个文件 main.raku
和 TestMod.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/]
我在目录 C:\Users\suman
.
main.raku
和 TestMod.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 格式的路径,那可能是问题的一部分。
这是
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/]