如何在Perl中使用Environment Modules系统?

时间:2014-11-06 18:32:00

标签: perl environment-modules

如何在Perl中使用Environment Modules系统 *

运行

system("load module <module>");

不起作用,大概是因为它要求转移到另一个环境。


*不要与Perl模块混淆。根据{{​​3}}:

  

环境模块系统是一种帮助用户管理其Unix或Linux shell环境的工具,允许动态制作或删除相关环境变量设置组。

3 个答案:

答案 0 :(得分:4)

看起来Perl模块Env::Modulecmd会做你想要的。来自文档:

  

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

使用示例:

 use Env::Modulecmd { load => 'foo/1.0' };

答案 1 :(得分:3)

或者,为了减少perl-namespace和更多类似于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');"

(这个问题,&#34; source perl环境模块&#34;使用这样的通用词,它几乎是无法搜索的。)

答案 2 :(得分:0)

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

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

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

我猜它会改变环境变量。要更改Perl的环境变量,必须在Perl进程中执行。这不会起作用,因为它肯定只是设计为集成到shell中。 (但是移植它可能并不太难。)

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

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);
}