通过shebang使用'time'命令运行python脚本

通过shebang使用'time'命令运行python脚本,python,bash,time,shebang,Python,Bash,Time,Shebang,我有一个python脚本,我希望能够从bash运行该脚本。 shebang很简单地解决了这个问题。 下一步是在shebang中实现time命令。 我最好但并非完全成功的想法是使用 #!/usr/bin/env -vS bash -c "time /usr/bin/python3 -OO" 遗憾的是,这并没有让python解释脚本文件,而是以一个交互式python会话结束 输出是 split -S: ‘bash -c "time /usr/bin/python3 -OO"’ into:

我有一个python脚本,我希望能够从bash运行该脚本。
shebang很简单地解决了这个问题。
下一步是在shebang中实现time命令。
我最好但并非完全成功的想法是使用

#!/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
你好
实0.028s
用户0m0.016s
系统0m0.000s
Kamori@Kamori-PC:/tmp#cat timed.py
#!/bin/bash startup.sh
打印(“你好”)
Kamori@Kamori-PC:/tmp#cat startup.sh
#!/usr/bin/env bash
时间蟒蛇3.7 timed.py

你不能用shebang来做这件事,因为它的格式()是:

此参数作为单个字符串传递(请参阅链接文档中的“解释器脚本”和“解释器脚本”)。换句话说,您不能将多个参数(除非它们可以连接到单个字符串)传递给解释器。这取决于代码执行方式的内核实现

在这里使用
env-S
也没有帮助,因为您可以在调试输出中看到:

   arg[0]= ‘bash’
   arg[1]= ‘-c’
   arg[2]= ‘time /usr/bin/python3 -OO’
   arg[3]= ‘./mypycheck.py’
它运行shell,告诉运行一个命令(
-c
),启动用
time
包装的python,然后将
'./mypycheck.py'
作为其最后一个参数传递给bash(不是python)。其含义是(适用于bash):

-c

如果存在
-c
选项,则从第一个非选项参数
command\u string
读取命令。如果
命令字符串
后有参数,则第一个参数将分配给
$0
,其余参数将分配给位置参数。对
$0
的赋值设置shell的名称,该名称用于警告 和错误消息


至于你的目标。您可以创建一个包装器,作为解释器来代替您的案例中的
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
问题,但在总结所有有用的细节之后,我还是能够通过以下解决方案实现我的目标

  • 通过运行sudo apt install time安装
  • 使用shebang
    #/usr/bin/env-S/usr/bin/time/usr/bin/python3-OO

  • 现在一切都按照我所期待的方式运行。

    哪些代码尝试过请分享?@AkashPagar:这当然独立于python代码。问题只是如何调用python解释器。我建议使用bash脚本来运行
    time python3/path/to/file.py
    ,或者自己运行
    time./file.py
    。这种方法在可移植性方面会给你带来痛苦。你能澄清一下你的问题是不是关于python脚本的计时(通过shebang,因为它看起来是可行的)?或者更多关于如何将shebang中的几个命令与env的(最近的)-s选项相结合的信息?@Demi Lune主要任务是将时间透明集成到函数中。使用bash中的
    time
    ,只需要关注粒度。计划是在每次跑步时自动进行。看来我已经找到了答案——只要再试一次,我当然会在这里发表。谢谢。这是一个好主意,但有点变通。我正在寻找一个单一的shebang解决方案。
    time
    不是一个真正的命令,它是bash的一个特性。(对我)没有时间命令
    哪个时间
    不返回任何内容,reading
    man bash
    解释了这一点。有一个time bash内置(
    帮助时间
    ),并且(至少在我的debian上)还有一个
    /usr/bin/time
    对不起,对我来说(我依赖于每个人都是一样的)在LSFW上,debian
    哪个时间
    为空,
    人工时间
    显示时间的详细信息。实际上,
    帮助时间
    展示了如何使用。但是对我来说没有二进制文件。
    apt get install time
    安装它。
    $ 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