【问题标题】:Run python script by shebang with `time` command使用`time`命令通过shebang运行python脚本
【发布时间】:2019-09-28 08:21:33
【问题描述】:

我有一个 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)

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

【问题讨论】:

  • 哪些代码试过了请分享?
  • @AkashPagar:这当然与 python 代码无关。问题只是如何调用 python 解释器。
  • 我建议您使用 bash 脚本来运行 time python3 /path/to/file.py 或自己运行 time ./file.py。这种方法在便携性方面会给您带来痛苦。
  • 您能否澄清一下您的问题是否与 Python 脚本的计时有关(通过 shebang,因为它似乎可行)?或者更多关于如何将 shebang 中的几个命令与 env 的(最近的)-S 选项结合起来?
  • @Demi-Lune 主要任务是在功能中集成定时透明。使用 bash 中的 time 只是感兴趣的粒度。计划是在每次运行时自动运行。看来我有这个想法 - 再试一次,然后我会在这里发布,当然。

标签: python bash time shebang


【解决方案1】:

最后从这里总结了所有有用的细节,我能够通过以下解决方案实现我的目标。

  1. 通过运行sudo apt install time 安装time utiliy
  2. 使用shebang #!/usr/bin/env -S /usr/bin/time /usr/bin/python3 -OO

现在一切都按照我想要的方式运行。

【讨论】:

    【解决方案2】:

    您可以通过创建辅助 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 解决方案。
    【解决方案3】:

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

    #!interpreter [optional-arg]
    

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

    在这里使用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_string 中读取命令。如果command_string 之后有参数,则将第一个参数分配给$0,并将任何剩余的参数分配给位置参数。对$0 的赋值设置了shell 的名称,用于警告 和错误消息。

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

    【讨论】:

      【解决方案4】:

      我猜你已经尝试过了

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

      【讨论】:

      • time 不是真正的命令,它是 bash 的一个特性。没有时间命令(对我来说)。 which time 没有返回任何内容,阅读 man bash 对此进行了解释。
      • 内置了一个 time bash (help time),并且(至少在我的 debian 上)还有一个 /usr/bin/time
      • 对不起,对我来说(我依赖于每个人都一样) LSFW debian which time 是空的,man time 在 time.h 上显示详细信息。确实help time 展示了如何使用。但对我来说,没有二进制。
      • apt-get install time 安装它。
      猜你喜欢
      • 2014-05-11
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      相关资源
      最近更新 更多