Jak uruchomić skrypt w Pythonie z argumentem?

Oct 23 2020

Chcę uruchomić skrypt Pythona z argumentem „arg”

  > python app.py arg

Bez 'arg' działa jak

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

ale nie rozumiem, jak dodać „argument”.

Odpowiedzi

3 TimLaska Oct 23 2020 at 02:57

Mam wiele środowisk Python na moim komputerze i nigdy nie byłem w stanie rozpoznać mojego ExternalEvaluator. Moim obejściem jest po prostu użycie polecenia powłoki. Jeśli Twoja aplikacja zwraca tylko wartości, może działać wystarczająco dobrze. Na przykład, moja odpowiedź dotycząca fizyki sztywnego ciała pochodziła z Mathematica , ale ciężkie podnoszenie zostało wykonane za pomocą pytona Blendera. Jeśli Twoja aplikacja jest interaktywna, ta odpowiedź nie jest dla Ciebie.

Jeśli skopiujemy przykład prog.py z argparse Pythona , możemy wykonać proste polecenie powłoki. Oto lista Pythona:

#!/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))

Oto jeden sposób użycia 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 *)

Oto alternatywny sposób użycia RunProcess:

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

Aktualizacja w odpowiedzi na komentarz

Kod w komentarzu, Run["c:\\test\\python app.py --sum >> out2"] zwraca błąd, ponieważ oczekuje listy argumentów rozdzielonych spacjami. RunProcessdaje lepszy wgląd w problem. Na przykład:

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
  
  "|> *)

Kod zakończenia 0 oznacza, że ​​kod został wykonany pomyślnie. Niezerowy kod wyjścia nie wysyła wyjścia do standardowego wyjścia, ale do standardowego błędu. Błąd standardowy wskazuje, że wystąpił błąd użycia wymagający co najmniej 1 argumentu liczbowego.