Wie führe ich ein Python-Skript mit einem Argument aus?

Oct 23 2020

Ich möchte ein Python-Skript mit dem Argument 'arg' ausführen.

  > python app.py arg

Ohne 'arg' funktioniert es wie

 session = StartExternalSession["Python"];
 ExternalEvaluate[session, File["app.py"]];

aber ich verstehe nicht, wie man 'arg' hinzufügt.

Antworten

3 TimLaska Oct 23 2020 at 02:57

Ich habe viele, viele Python-Umgebungen auf meinem Computer und konnte meinen ExternalEvaluator nie erkennen lassen. Meine Problemumgehung besteht darin, nur einen Shell-Befehl zu verwenden. Wenn Ihre App nur Werte zurückgibt, funktioniert sie möglicherweise gut genug. Zum Beispiel wurde meine Antwort auf die Starrkörperphysik von Mathematica übernommen , aber das schwere Heben wurde mit Blenders Python durchgeführt. Wenn Ihre App interaktiv ist, ist diese Antwort nichts für Sie.

Wenn wir das Beispiel prog.py aus Pythons argparse kopieren , können wir einen einfachen Shell-Befehl ausführen. Hier ist die Python-Liste:

#!/usr/bin/env python
# prog.py
import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()

print(args.accumulate(args.integers))

Hier ist eine Möglichkeit Run:

SetDirectory[NotebookDirectory[]];
outputfile = CreateFile[];
Run["C:\\Users\\Tim\\Anaconda2\\envs\\env37\\python prog.py 1 2 3 4 \
--sum >>" <> outputfile];
stext = OpenRead[outputfile];
Read[stext, Number]
DeleteFile[outputfile];
(* 10 *)

Hier ist eine alternative Möglichkeit RunProcess:

SetDirectory[NotebookDirectory[]];
RunProcess[{"C:\\Users\\Tim\\Anaconda2\\envs\\env37\\python", 
   "prog.py", "--sum", "1", "2", "3", "4"}]["StandardOutput"]
(* "10" *)

Update als Antwort auf einen Kommentar

Der Code im Kommentar Run["c:\\test\\python app.py --sum >> out2"] gibt einen Fehler zurück, da er eine Liste von durch Leerzeichen getrennten Argumenten erwartet. RunProcessgibt mehr Einblick in das Problem. Zum Beispiel:

SetDirectory[NotebookDirectory[]];
RunProcess[{"C:\\Users\\Tim\\Anaconda2\\envs\\env37\\python", 
  "prog.py", "--sum"}]
(* <|"ExitCode" -> 2, "StandardOutput" -> "", 
 "StandardError" -> "usage: prog.py [-h] [--sum] N [N ...]
  
  prog.py: error: the following arguments are required: N
  
  "|> *)

Exit-Code 0 bedeutet, dass der Code erfolgreich ausgeführt wurde. Der Exit-Code ungleich Null sendet die Ausgabe nicht an den Standardausgang, sondern an den Standardfehler. Standardfehler zeigt an, dass ein Verwendungsfehler vorliegt, der mindestens 1 numerisches Argument anfordert.