3
$\begingroup$

The following function allows me to remotely execute Wolfram code on another machine that has wolframscript installed:

Attributes[remoteExecute] = {HoldAllComplete};
remoteExecute[(* remote_, *) expr_] := 
 Module[{compressed, ubuntuBox = RemoteConnect["192.162.0.2", "username", "password"]}, 
  compressed = ExportString[ToString[Hold[expr], InputForm], "Base64"];
  ToExpression[
   RemoteRunProcess[ubuntuBox, 
    "wolframscript -format InputForm -code 'ReleaseHold[ImportString[\
\"" <> compressed <> "\",\"Base64\"]]'", "StandardOutput"]]]

For example:

(* Return True: *)
FileExistsQ["~/only_on_my_remote_machine"] // remoteExecute

Problem: This function doesn't work on every function, however, and it is mysterious why:

How to fix?

$\endgroup$
12
  • $\begingroup$ What's returned by the function? If it's a String that means the encoding didn't quite go right. By the way this would be easier to write as Compress[Unevaluated[expr] and then you would execute by calling Uncompress[compressed]. I think you might be happier with that. $\endgroup$
    – b3m2a1
    Commented Aug 23, 2019 at 15:49
  • $\begingroup$ b3m2a1: Is your proposed function then this one? $\endgroup$
    – George
    Commented Aug 23, 2019 at 17:41
  • $\begingroup$ No. Don't use ExportString and don't use ImportString or ReleaseHold. Just do something like RemoteRunProcess[ubuntuBox, TemplateApply["wolframscript -format InputForm -code 'Uncompress[\"`\`\"]'", Compress[Unevaluated[expr]]] $\endgroup$
    – b3m2a1
    Commented Aug 23, 2019 at 17:43
  • $\begingroup$ I'm getting compression error output like Uncompress::corrupt: Compressed data "ïÂÂ" is corrupt and does \ not represent an expression.` $\endgroup$
    – George
    Commented Aug 23, 2019 at 17:49
  • 1
    $\begingroup$ b3m2a1: Removing the backslashes worked! Thanks for your help. I think you accidentally included backslashes in your formatted markdown above^. $\endgroup$
    – George
    Commented Aug 23, 2019 at 18:09

1 Answer 1

1
$\begingroup$

The following

Attributes[remoteExecute] = {HoldAllComplete};
remoteExecute[expr_] := 
 Module[{compressed, 
   ubuntuBox = RemoteConnect[ip, "username", "password"]}, 
  compressed = Compress[Unevaluated[expr]]; 
  ToExpression[
   RemoteRunProcess[ubuntuBox, 
    TemplateApply[
     "wolframscript -format InputForm -code 'Uncompress[\"``\"]'", 
     compressed], "StandardOutput"]]]

is able to execute functions remotely, so long as your function isn't locally defined.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.