【问题标题】:Python get script output with now only the pid of filePython现在只使用文件的pid获取脚本输出
【发布时间】:2015-01-26 10:48:58
【问题描述】:

例如我运行一个脚本

os.execv('script.py',('',))

正如我在文档中所读到的,此命令通过获取当前脚本的 pid 并对其重新签名以运行 script.py 来启动脚本。所以我可以得到进程的pid。 问题如下: 运行 execv 后,我需要获取该脚本的标准输出,而我唯一知道的是进程的 pid。是否可以使用 python 执行此操作?有什么建议么 ?我只需要使用execv()

【问题讨论】:

    标签: python stdout pid


    【解决方案1】:

    另一种将输出重定向到文件的可能解决方案。

    import os,sys
    sys.stdout = open("./data.out","w")
    os.dup2(sys.stdout.fileno(), 1)
    os.execv('/usr/bin/python', ['python', './script.py'])
    

    【讨论】:

    • 太好了,这就是我要说的。谢谢
    • 但是你能不能帮忙做这个解缓冲?这样 execv 脚本输出不会收集缓冲区,而是立即将数据放入文件中?
    • @user3581394 是的,输出是一个文件
    • 嗯,我说的是非阻塞输出到文件,例如:print 'hi' 在文件中运行 'hi' 写入 /data.outprint,'goodbye' 在文件中运行'goodbye' 被写入 /data.out。让它实时发生
    【解决方案2】:

    os.execv 只是绑定到 execve 系统调用。你需要的是一个subprocess 模块:

    import sys
    import subprocess
    
    proc = subprocess.Popen([sys.executable, 'script.py'],
                            stdout = subprocess.PIPE)
    proc.wait()
    print(proc.stdout.read())
    

    https://docs.python.org/2/library/subprocess.html

    【讨论】:

    • 但是子进程创建了一个可能导致僵尸进程的子进程。所以我不能使用子进程模块
    • proc.wait() 将确保您不会遇到僵尸。您可以将其添加到 finally 块中。 os.execv() 完全替换了你的图像,这意味着在调用它之后你当前的脚本已经死了,只有脚本“script.py”存在
    猜你喜欢
    • 1970-01-01
    • 2017-12-30
    • 2020-08-22
    • 2014-11-21
    • 2015-05-22
    • 2012-02-01
    • 2012-04-18
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多