我正在尝试使用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.pl
与DEBTOR_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
(和require
d文件ENVRC.pl
将始终保持在同一目录中,则最好使用FindBin而不是硬编码路径
use warnings;
use strict;
...
use FindBin qw($RealBin);
use lib $RealBin;
无论哪种情况,现在都可以通过use
和require
(以及do
(找到该目录中的文件。
DEBTOR
程序在较旧的Perls中直接从其目录执行时工作,因为默认情况下.
(当前工作目录(曾经包含在@INC
中。我们从错误消息中打印@INC
看到这种情况。所以.
被搜索并找到ENVRC.pl
。
依赖它实际上一直是一种不好的做法,但从 perl v5.26.0 (perldelta((2017 年 5 月(开始,.
目录不再@INC
。
因此,无论如何,您都应该将上述use lib
语句添加到DEBTOR...
程序中。