Как запустить скрипт Python с аргументом?

Oct 23 2020

Я хочу запустить скрипт Python с аргументом 'arg'

  > python app.py arg

Без аргумента это работает как

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

но я не понимаю, как добавить аргумент.

Ответы

3 TimLaska Oct 23 2020 at 02:57

У меня на компьютере много сред Python, и мне так и не удалось заставить свой ExternalEvaluator распознать. Мой обходной путь - просто использовать команду оболочки. Если ваше приложение просто возвращает значения, оно может работать достаточно хорошо. Например, мой ответ по физике твердого тела был взят из Mathematica , но тяжелая работа была сделана с помощью питона Blender. Если ваше приложение интерактивное, этот ответ не для вас.

Если мы скопируем пример prog.py из Python argparse , то сможем выполнить простую команду оболочки. Вот список 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))

Вот один из способов использования 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 *)

Вот альтернативный способ использования RunProcess:

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

Обновление в ответ на комментарий

Код в комментарии Run["c:\\test\\python app.py --sum >> out2"] возвращает ошибку, поскольку ожидает список аргументов, разделенных пробелами. RunProcessдает больше понимания проблемы. Например:

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

Код выхода 0 означает, что код успешно выполнен. Ненулевой код выхода отправляет вывод не в стандартный выход, а в стандартную ошибку. Стандартная ошибка показывает, что существует ошибка использования, запрашивающая хотя бы 1 числовой аргумент.