Запустите скрипт на python с помощью команды `time` - PullRequest
2 голосов
/ 28 сентября 2019

У меня есть скрипт на python, который я хочу запускать из bash.
Это просто решается с помощью shebang.
Следующим шагом является внедрение команды time в shebang.
MyЛучшей, но не полной удачной идеей было использование

#!/usr/bin/env -vS bash -c "time /usr/bin/python3 -OO"

, которое, к сожалению, не заставляет python интерпретировать файл сценария и заканчивается в интерактивной сессии Python.

Вывод

split -S:  ‘bash -c "time /usr/bin/python3 -OO"’
 into:    ‘bash’
     &    ‘-c’
     &    ‘time /usr/bin/python3 -OO’
executing: bash
   arg[0]= ‘bash’
   arg[1]= ‘-c’
   arg[2]= ‘time /usr/bin/python3 -OO’
   arg[3]= ‘./mypycheck.py’
Python 3.7.3 (default, Apr  3 2019, 05:39:12)

Как я могу сделать работу?Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 28 сентября 2019

Вы не можете сделать это с помощью шебанга, потому что его формат ( в Linux ):

#!interpreter [optional-arg]

И этот аргумент передается в виде одной строки (см. «Сценарии интерпретатора» и«Сценарии переводчика» в связанном документе).Другими словами, вы не можете передать несколько аргументов (если они не могут быть объединены в одну строку) интерпретатору.Это связано с реализацией в ядре того, как выполняется код.

Использование env -S здесь также бесполезно, потому что, как вы можете видеть в результатах отладки:

   arg[0]= ‘bash’
   arg[1]= ‘-c’
   arg[2]= ‘time /usr/bin/python3 -OO’
   arg[3]= ‘./mypycheck.py’

Он запускает оболочку, приказывает запустить команду (-c), начиная с python, заключенного в time и затем передавая ‘./mypycheck.py’ bash (не python) в качестве последнего аргумента.значение которого (применяется к bash):

-c

Если присутствует опция -c, то команды читаются из первого неопционального аргумента command_string.Если после command_string есть аргументы, первый аргумент присваивается $0, а все остальные аргументы присваиваются позиционным параметрам.Присвоение $0 устанавливает имя оболочки, которое используется в предупреждениях и сообщениях об ошибках.

Что касается вашей цели.Вы можете создать оболочку, которая будет использоваться в качестве интерпретатора вместо env в вашем случае, которая выполняет желаемые действия и передает сценарий фактическому интерпретатору.

1 голос
/ 28 сентября 2019

Полагаю, вы уже просто попробовали

#!/usr/bin/time python3

Разве это не нормально?(то есть является ли -OO в ваших тестах обязательным?)

Пример:

$ cat test.py
#!/usr/bin/time python3
import sys
print (sys.argv)

$ ./test.py 
['./test.py']
0.01user 0.00system 0:00.02elapsed 95%CPU (0avgtext+0avgdata 9560maxresident)k
0inputs+0outputs (0major+1164minor)pagefaults 0swaps

Хотя это еще не решает -OO

1 голос
/ 28 сентября 2019

Вы можете решить эту проблему, создав дополнительный сценарий bash и просто вызвав его как шебанг.

Kamori@Kamori-PC:/tmp# ./timed.py
hello

real    0m0.028s
user    0m0.016s
sys     0m0.000s
Kamori@Kamori-PC:/tmp# cat timed.py
#!/bin/bash startup.sh

print("hello")
Kamori@Kamori-PC:/tmp# cat startup.sh
#!/usr/bin/env bash

time python3.7 timed.py
0 голосов
/ 29 сентября 2019

В конце суммируя все полезные подробности, я смог достичь своей цели с помощью следующего решения.

  1. Установка time с помощью команды sudo apt install time
  2. Использование шебанга #!/usr/bin/env -S /usr/bin/time /usr/bin/python3 -OO

И теперь все работает так, как я искал.

...