运行 python shebang 使用 `time` 命令编写的脚本

Run python script by shebang with `time` command

我有一个 python 脚本,我希望能够从 bash.
运行 shebang简单解决了这个问题
下一步是将时间命令执行到 shebang 中。
我最好但不是完全成功的想法是使用

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

我怎样才能完成这份工作?提前致谢。

您可以通过创建辅助 bash 脚本解决此问题,并将其作为 shebang 调用。

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

你不能用 shebang 做到这一点,因为它的格式 (on Linux) 是:

#!interpreter [optional-arg]

并且此参数作为单个字符串传递(请参阅链接文档中的 "Interpreter scripts" 和 "Interpreter scripts")。换句话说,您不能将多个参数(除非它们可以连接成一个字符串)传递给解释器。这取决于代码如何执行的内核实现。

使用 env -S 在这里也没有帮助,因为正如您在调试输出中看到的那样:

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

它运行s shell,告诉运行一个命令(-c)开始python包裹在time然后通过‘./mypycheck.py’ 到 bash(不是 python)作为它的最后一个参数。其中的含义是(应用于bash):

-c

If the -c option is present, then commands are read from the first non-option argument command_string. If there are arguments after the command_string, the first argument is assigned to [=20=] and any remaining arguments are assigned to the positional parameters. The assignment to [=20=] sets the name of the shell, which is used in warning and error messages.

至于你objective。您可以创建一个包装器,用作解释器代替 env 在您的情况下执行所需的操作并将脚本传递给实际的解释器。

我猜你已经试过了

#!/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. 安装 time 实用程序 运行 sudo apt install time
  2. 使用 shebang #!/usr/bin/env -S /usr/bin/time /usr/bin/python3 -OO

现在一切都是 运行 我一直在寻找的方式。