Como executar o script Python com um argumento?

Oct 23 2020

Eu quero executar o script Python com o argumento 'arg'

  > python app.py arg

Sem 'arg' funciona como

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

mas eu não entendo como adicionar 'arg'.

Respostas

3 TimLaska Oct 23 2020 at 02:57

Tenho muitos ambientes python em meu computador e nunca fui capaz de fazer o meu ExternalEvaluator reconhecer. Minha solução alternativa é apenas usar um comando shell. Se seu aplicativo retornar apenas valores, ele pode funcionar bem o suficiente. Por exemplo, minha resposta de física de corpo rígido foi tirada do Mathematica , mas o trabalho pesado foi feito com a píton do Blender. Se seu aplicativo for interativo, esta resposta não é para você.

Se copiarmos o exemplo prog.py do argparse do Python , podemos executar um comando shell simples. Aqui está a lista de python:

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

Aqui está uma maneira de usar 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 *)

Aqui está uma forma alternativa usando RunProcess:

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

Atualização em resposta ao comentário

O código em comentário Run["c:\\test\\python app.py --sum >> out2"] ,, retorna um erro porque está esperando uma lista de argumentos delimitados por espaço. RunProcessdá mais informações sobre o problema. Por exemplo:

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

O código de saída 0 significa que o código foi executado com sucesso. O código de saída diferente de zero não envia a saída para a saída padrão, mas para o erro padrão. O erro padrão mostra que há um erro de uso solicitando pelo menos 1 argumento numérico.