【问题标题】:Make osascript print stdout interactively / in real-time使 osascript 以交互方式/实时打印标准输出
【发布时间】:2018-03-07 15:09:13
【问题描述】:

好的,所以我有这个非常简单的 python 脚本:

import time
import sys

for i in range(25):
    time.sleep(1)
    print(i)

sys.exit()

当我使用 python 运行它时(/usr/local/bin/python3.6 testscript.py),一切正常,输出显示:

1
2
3
4
etc..

每个数字一个接一个地打印 1 秒。

但是当我跑步时:

/usr/bin/osascript -e 'do shell script "/usr/local/bin/python3.6 testscript.py" with prompt "Sart Testing " with administrator privileges'

25秒没有任何输出,最后打印出来:

24

到终端。

问题是:如何让 osascript 打印出与直接运行 Python 脚本时完全相同的输出?

【问题讨论】:

    标签: python terminal applescript stdout osascript


    【解决方案1】:

    AppleScript 的 do shell script command 在非交互式 shell 中运行,因此您无法像拥有它一样执行 osascript command并期望它的输出与通过python 运行python 脚本 或直接运行相同。换句话说,直接添加python shebang 并使文件可执行,因此 Terminal 中的./testscript.py 就是您所需要的。或者使用 Terminal 及其 do script commandosascript

    python 代码另存为。例如:

    #!/usr/local/bin/python3.6
    
    import time
    import sys
    
    for i in range(25):
        time.sleep(1)
        print(i)
    
    sys.exit()
    

    使其可执行:

    chmod u+x testscript.py
    

    在终端中运行:

    ./testscript.py
    

    或者:

    osascript -e 'tell app "Terminal" to do script "/path/to/testscript.py"'
    

    python 代码 没有shebang 并且在使用终端 do script 命令时无法执行>:

    osascript -e 'tell app "Terminal" to do script "/usr/local/bin/python3.6 /path/to/testscript.py"'
    

    【讨论】:

    • 感谢您的回复,问题是:我正在通过 subprocess.Popen 在另一个 Python 脚本中启动 osascript。目标是:python_script1 运行一个 GUI,该 GUI 可以使用 sudo 权限启动 python_script2,然后每当脚本 2 向 stdout 写入一行时向进度条添加一个步骤。只要我不使用 osascript,我就可以让这个设置按预期工作,但我需要一种干净、简单且原生的方式来在启动第二个脚本时询问 sudo 密码。
    • 我意识到我的评论实际上完全是另一个问题,但我想如果有办法让 osascript 将输出打印到标准输出,我的问题就会得到解决。
    • 开始了一个直接相关的新问题:stackoverflow.com/q/49171769/4041795
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2013-05-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    相关资源
    最近更新 更多