plink- 使用Windows中的python程序运行位于远程Linux服务器上的perl脚本时@INC错误中找不到.pl



我正在尝试使用python程序从Windows运行位于远程Linux服务器中的perl脚本。我正在使用subprocess.call方法。

这是蟒蛇代码行

returnCd = subprocess.call(['plink', '-ssh', 
'%s@%s' %('******','*****.***.com'), '-pw', '****', 
'perl', '/apps/CACSGDEV/springbatch/perlscript/DEBTOR_VERIFICATION.pl'], 
shell=True)

这就是我在控制台中看到的(为了可读性而换行(

无法在@INC中找到 ENVRC.pl(@INC包含:/usr/local/lib64/perl5/usr/local/share/perl5/usr/lib64/perl5/vendor_perl/usr/share/perl5/vendor_perl/usr/lib64/perl5/usr/share/perl5 .( 在/apps/CACSGDEV/springbatch/perlscript/DEBTOR_VERIFICATION.pl 第 16 行。

文件DEBTOR_VERIFICATION.pl具有以下@行16

require "ENVRC.pl";

文件ENVRC.plDEBTOR_VERIFICATION.pl的路径相同。任何人都可以建议吗?

程序DEBTOR_VERIFICATION.pl是直接执行的,因此它不需要将其目录放在@INC中。另一方面,当文件需要通过require(或使用,使用require(加载时,那么搜索它的恰恰是@INC中的目录。由于ENVRC.pl所在的/apps/..不存在,因此找不到该文件。

您需要将该目录添加到@INC,一个好方法是通过lib编译指示

use warnings;
use strict;
...
use lib "/apps/CACSGDEV/springbatch/perlscript";
...

但是,如果这个程序(DEBTOR_VERIFICATION.pl(和required文件ENVRC.pl将始终保持在同一目录中,则最好使用FindBin而不是硬编码路径

use warnings;
use strict;
...
use FindBin qw($RealBin);
use lib $RealBin;

无论哪种情况,现在都可以通过userequire(以及do(找到该目录中的文件。

DEBTOR程序在较旧的Perls中直接从其目录执行时工作,因为默认情况下.(当前工作目录(曾经包含在@INC中。我们从错误消息中打印@INC看到这种情况。所以.被搜索并找到ENVRC.pl

依赖它实际上一直是一种不好的做法,但从 perl v5.26.0 (perldelta((2017 年 5 月(开始,.目录不再@INC

因此,无论如何,您都应该将上述use lib语句添加到DEBTOR...程序中。

最新更新