Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much

Re^2: pp macOS external file

by Anonymous Monk
on Apr 20, 2018 at 13:11 UTC ( [id://1213245]=note: print w/replies, xml ) Need Help??

in reply to Re: pp macOS external file
in thread pp macOS external file

Thank you, marto. Your solution works for me (perl v.5.16). However, for the sake of easiness (I have 50 or 60 files!), I would prefer the executable to read the files from an external folder. This is not a problem with pp on Windows, so - I guess - there should be a way to achieve this on macOS too.

Replies are listed 'Best First'.
Re^3: pp macOS external file
by marto (Cardinal) on Apr 20, 2018 at 13:27 UTC

    If you mean that you have a directory containing some resources (e.g. /app/logos/ or C:\productname\logos) detect OS ($^O) and prepend the path accordingly. Then you wouldn't need the environment variable stuff in that example.

      I am a bit confused. The .png file is in the same directory as the executable (I can not have absolute paths, but only relative ones). So, the path for this icon should already be correct (and from the Terminal it works okay). How should the relative path differ in the executable? the OS is darwin.

      Added: the problem should be that the executable sees the relative path starting from its "internal" (I do not how to call it) position that a simple:

      use File::Basename; my $dirname= dirname(__FILE__);

      inside my original script reveals to be different than the physical position of the executable on the machine.

        "So, the path for this icon should already be correct (and from the Terminal it works okay"

        Not when you run it. What follows is a sort of high level explanation of how this works. An executable generated by pp is essentially a self extracting/executing zip file. You can use the normal unzip command to extract it. The first time it executes it gets extracted to a temporary area. For your problem I had:

        marto@Shemp:~/perlmonks/pp$ ls myicon.png

        When packed (as above) and executed this gets extracted to a temporary area, in this case: /tmp/par-6d6172746f/cache-b3da3d80145db3849552916091b87f92bea49883

        In the work around above this is accessible via $ENV{PAR_TEMP}. Within this directory you'll find the various bits & bobs, modules, libraries and so on that are required to run your code without needing perl (and all of those other things) installed.

        Within this is a directory inc:

        drwxr-xr-x 4 marto marto 4096 Apr 20 13:02 . drwx------ 3 marto marto 4096 Apr 20 13:02 .. drwxr-xr-x 16 marto marto 4096 Apr 20 13:02 lib -rw-r--r-- 1 marto marto 7189 Apr 20 13:02 MANIFEST -rw-r--r-- 1 marto marto 212 Apr 20 13:02 META.yml -rw-rw-r-- 1 marto marto 13052 Apr 20 13:02 myicon.png drwxr-xr-x 2 marto marto 4096 Apr 20 13:02 script

        here we see myicon.png. the actual script is in the sub directory 'script'. Another method I've seen people use is to embed the images within their code, and use the Tk::Photo -data option (rather than -file).

      I have solved it in this way, even if I am not very happy to use the $0 variable

      use strict; use warnings; use FindBin; $0 = "stealth"; use Tk; use Tk::PNG; my $png = "$FindBin::Bin/myicon.png"; my $mw = Tk::MainWindow->new(); my $icon = $mw->Photo(-file => $png); my $btn = $mw->Button( -image => $icon, ); $btn->pack(); $mw->MainLoop();

        Are you sure this is the solution you are looking for? If I move this exe into a different location from all the source (the perl and png file) I get:

        marto@Shemp:~/perlmonks$ ./test2 Cannot open '/home/marto/perlmonks/myicon.png' in mode 'r' at Tk/Image line 21

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1213245]
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others surveying the Monastery: (2)
As of 2024-07-16 09:10 GMT
Find Nodes?
    Voting Booth?

    No recent polls found

    erzuuli‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.