4

如何使用环境模块系统*在 Perl 中

跑步

system("load module <module>");

不起作用,大概是因为它分叉到另一个环境。


* 不要与 Perl 模块混淆。根据维基百科条目

Environment Modules 系统是一个帮助用户管理他们的 Unix 或 Linux shell 环境的工具,它允许动态地创建或删除相关的环境变量设置组。

4

3 回答 3

4

看起来 Perl 模块Env::Modulecmd会做你想做的事。从文档中:

Env::Modulecmd提供了一个modulecmd从 Perl 的自动化接口。最直接的用途Env::Modulecmd是在编译时加载和卸载模块,尽管提供了许多其他用途。

示例用法:

 use Env::Modulecmd { load => 'foo/1.0' };
于 2014-11-06T18:56:47.323 回答
3

或者,要减少 perl 命名空间,而更多地使用环境模块 shell,您可以像其他 shell 一样获取 Environment Modules 初始化 perl 代码:

do( '/usr/share/Modules/init/perl');
module('load use.own');
print module('list'); 

对于单行示例:

perl -e "do ('/usr/share/Modules/init/perl');print module('list');"

(这个问题,“源 perl 环境模块”使用了这样的通用词,几乎无法搜索。)

于 2016-12-16T15:52:13.570 回答
-1
system("load module foo ; foo bar");

或者,如果这不起作用,那么

system("load module foo\nfoo bar");

我猜它会改变环境变量。要更改 Perl 的环境变量,必须在 Perl 进程中执行。那是行不通的,因为它肯定只是设计用于集成到外壳中。(不过,移植它可能并不难。)

如果您可以在加载模块后重新启动脚本,您可以使用以下解决方法:

use String::ShellQuote qw( shell_quote );

BEGIN {
   if (!@ARGV || $ARGV[0] ne '!!foo_loaded!!') {
      my $perl_cmd = shell_quote($^X, '--', $0, '!!foo_loaded!!', @ARGV);
      exec("load module foo ; $perl_cmd")
         or die $!;
   }

   shift(@ARGV);
}
于 2014-11-06T18:53:07.073 回答