2009-07-14 6 views
6

この私は、Linuxシステム上での簡単なPerlスクリプトを作成した"Why don’t my system calls work in the Perl program I wrap with pp?"を上げた余分な問題を切断する私の試みです:私はPPを使用pp(PAR)はどこにadd(-a)ファイルを展開しますか?

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

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

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

$out = `sh out_test.sh`; 

print "$out\n"; 

このスクリプトは、簡単なシェルファイルを呼び出しますシェルスクリプトとともにPerlスクリプトをls_testにパックするには:

 
new-net:~/test # unzip -l ls_test 
Archive: ls_test 
    Length  Date Time Name 
-------- ---- ---- ---- 
     0 07-13-09 16:41 script/ 
     436 07-13-09 16:41 MANIFEST 
     214 07-13-09 16:41 META.yml 
     93 07-13-09 16:41 script/ls_test.pl 
     538 07-13-09 16:41 script/main.pl 
     16 07-13-09 16:20 out_test.sh 
--------     ------- 
    1297     6 files 

もしそうでなければeでパックされたファイルを実行するとMPTYディレクトリ、シェルスクリプトが見つからない:私はディレクトリにシェルスクリプトをコピーする場合、期待どおり

 
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

いいえ、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引き数を使用する外部ファイルが含まれています。溶液中の最初のステップは、POE「$ヒープ」にこの情報を追加しました

$ENV{PAR_TEMP}

経由でこれらのファイルは、パッケージおよびスクリプトに利用できるが作成した「TEMP」パスの下に\ INCディレクトリに展開されています。下の行はインライン状態 "_start"です。

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

私はWin32環境で働いていますように、私は一時パスへの\ INCディレクトリを追加するエスケープバックスラッシュを使用していました。

アプリケーションに入力する外部ファイルを呼び出すときに、変数(@zone)を使用してデータを返しました。

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

外部アクションを完了するための呼び出しの場合、ファイルは出力を保存せずに呼び出されます。

`$heap->{t_path}cpau -dec -file $heap->{t_path}del_event.job -nowarn -wait`;

この素晴らしい環境を提供するためにstackoverflowに貢献してくれて、ありがとうございました。

+3

は、ダブルバックスラッシュを使用するのではなく、 'File :: Spec-> catfile($ ENV {PAR_TEMP}、 'inc')'を使用します。ちなみに、私はこのスレッドで何か答えをアップアップした唯一の人だと少し驚いています。あなたがSOに感謝の気持ちを示す方法は、アップボーニングの回答です。 –

関連する問題