2009-07-14 2 views
6

이것은 외계 문제 제기를 줄이기위한 시도입니다. "Why don’t my system calls work in the Perl program I wrap with pp?" 리눅스 시스템에서 간단한 Perl 스크립트를 만들었습니다 :pp (PAR)는 어디에서 추가 파일 (-a)을 풀었습니까?

new-net:~/scripts # cat ls_test.pl 
@ls_out = `ls -l`; 

map { print "$_\n" } @ls_out; 

$out = `sh out_test.sh`; 

print "$out\n"; 

이 스크립트는 간단한 쉘 파일을 호출합니다.

new-net:~/scripts # cat out_test.sh 
echo "I'm here" 

pp 쉘 스크립트와 함께 Perl 스크립트를 ls_test에 압축하려면 다음과 같이 입력하십시오.

그렇지 않으면 빈 디렉토리에서 압축 파일을 실행하면 쉘 스크립트가 없습니다.

 
new-net:~/test # ./ls_test 
total 3391 

-rwxr-xr-x 1 root root 3466177 Jul 13 16:41 ls_test 

sh: out_test.sh: No such file or directory 

쉘 스크립트를 디렉토리에 복사하면 압축 된 스크립트가 예상대로 실행됩니다.

 
new-net:~/test # ./ls_test
total 3395 -rwxr-xr-x 1 root root 3466177 Jul 13 16:41 ls_test -rw-r--r-- 1 root root 16 Jul 13 16:20 out_test.sh I'm here

따라서 pp 압축 스크립트는 포함 된 파일을 어디에서 찾을 수 있습니까? 그리고 포함 된 파일에 대한 호출을 원래 Perl 스크립트에서 어떻게 구성해야합니까?

답변

6

패키지 된 실행 파일의 파일은 임시 디렉토리 (일반적으로/tmp/par-USERNAME/cache-XXXXXXX)로 추출됩니다. 이 파일은 다음과 같이 수행에 액세스하려면 :

#!/usr/bin/perl 

# Reads a data file from the archive (added with -a) 
print PAR::read_file("data"); 

# Will execute "script2" in the archive and exit. Will not return to this script. 
require PAR; 
PAR->import({ file => $0, run => 'script2' }); 

또한 실행할 스크립트와 같은 이름을 가진 실행 파일에 대한 symolic 링크를 만들 수 있습니다, 그리고 사람들을 실행합니다.

사실, 질문, 단순히 PAR_TEMP 환경 변수에 접근을 다시 읽는 것은 아마 더 유용

 
C:\tmp> cat build.bat 
@echo off 
mkdir output 
call pp -o runner.exe runner.pl -a sayhello.bat 
move runner.exe output\runner.exe 
C:\tmp> cat sayhello.bat 
@echo I am saying hello ... 

C:\tmp> cat runner.pl 
#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Spec::Functions qw(catfile); 

my $prog_path = catfile $ENV{PAR_TEMP}, inc => 'sayhello.bat'; 

my $output = `$prog_path`; 

print "The output was: >>> $output <<< "; 

__END__ 

:

여기
#!/usr/bin/perl 
use File::Slurp qw(slurp); 

$data_dir = "$ENV{PAR_TEMP}/inc"; 
$script_dir = "$data_dir/script"; 

print slurp("$data_dir/datafile"); 

# file access permissions are not preserved as far as I can tell, 
# so you'll have to invoke the interpreter explicitly. 
system 'perl', "$script_dir/script2", @args; 
+1

from perldoc PAR; run par에서 실행할 스크립트의 이름입니다. 완료되면 종료됩니다. 추가 된 파일에 대한 호출이 패키지 된 스크립트를 종료한다는 것을 의미합니까? 원래 해결하려고했던 문제는 위젯 명령에서 다양한 외부 파일을 호출하는 POE/TK 스크립트입니다. – jpolache

3

내 시스템에 근무 뭔가 출력 :

C:\tmp\output> runner.exe 
The output was: >>> I am saying hello ... 
<<< 

약간 더러워 보입니다.

+0

MSWindows와 비슷하게 PAR의 기본 캐시/임시 디렉토리가 현재 디렉토리입니다. – Inshallah

+2

Nope, C : \ DOCUME ~ 1 \ username \ LOCALS ~ 1 \ Temp \ par-username \ cache-07b6bc6c42c824d8fdd5abd08eb8b67b2bf7ecab ... 그러나, 당신의 의견은 내가 포스트에서'build.bat'을 수정하는 것을 잊었다는 것을 깨닫게했습니다. . –

+1

PAR_TEMP를 사용하는 것이 더럽습니까? 추출 디렉토리를 참조하는 다른 방법을 찾지 못했습니다. 물론 아카이브를 직접 추출한 다음 그 아카이브의 위치를 ​​알 수 있습니다. – Inshallah

4

이 답변에 도움을 주신 모든 분들께 감사드립니다. 필자는이 답변을 추가하여 모든 사람의 소중한 의견을 바탕으로 특정 응용 프로그램에서 저에게 도움이되는 솔루션을 제시했습니다.

응용 프로그램은 POE 및 Tk를 사용하여 ActiveState Perl로 작성되고 pp를 사용하여 배포 용으로 패키지되어 있습니다. 여러 개의 외부 파일을 사용합니다. 일부는 프로그램에 입력하기 위해 (DNS로부터의 munged 데이터), 일부는 사용자가 취한 조치 (DNS 별명 레코드의 작성 및 삭제)에 사용됩니다.

PAR 패커 (pp)는 -a 인수를 사용하는 외부 파일을 포함합니다.이러한 파일은 솔루션

$ENV{PAR_TEMP}

첫 번째 단계를 통해 스크립트에 패키지 및 사용할 수에 의해 생성 된 "임시"경로 아래에있는 \ INC 디렉토리에 압축 해제하는 것은 POE "$ 힙"에이 정보를 추가하는 것이 었습니다 . 아래 줄은 인라인 상태 "_start"입니다.

$heap->{t_path} = "$ENV{PAR_TEMP}\\inc\\";

Win32 환경에서 작업 할 때 \ inc 디렉토리를 임시 경로에 추가하기 위해 이스케이프 처리 된 백 슬래시를 사용했습니다.

응용 프로그램에 입력 할 외부 파일을 호출 할 때 변수 (@zone)를 사용하여 데이터를 반환했습니다.

@zone = `$heap->{t_path}dnscmd aus-dc1 /enumrecords company.pvt @`;

외부 작업을 완료하기위한 호출의 경우 출력을 저장하지 않고 파일을 호출합니다.

이 멋진 환경을 제공하기 위해 stackoverflow에 기여해 주신 모든 분들께 감사드립니다.

+3

은 이중 백 슬래시를 사용하지 않고'File :: Spec-> catfile ($ ENV {PAR_TEMP}, 'inc')'을 사용합니다. 그건 그렇고, 나는이 스레드에서 어떤 대답을 upvoted 유일한 사람입니다 조금 놀랐습니다 : 당신이 SO에 대한 평가를 표시하는 방법은 upvoting 대답입니다. –