【问题标题】:Doing something after popen is finishedpopen 完成后做某事
【发布时间】:2016-09-17 14:17:20
【问题描述】:

我想创建一个显示file 和外部viewer 的后台进程。当进程停止时,它应该删除该文件。 下面的一段代码做了我想做的事,但它很丑,我想还有一种更惯用的方式。 如果它甚至独立于操作系统,那将是完美的。

 subprocess.Popen(viewer + ' ' + file + ' && rm ' + file, shell=True)

【问题讨论】:

    标签: python python-3.x subprocess popen


    【解决方案1】:

    使用subprocess.call() 打开查看器并查看文件正是这样做的。随后,运行命令删除文件。

    如果您希望脚本在进程运行时继续运行,请使用threading

    一个例子:

    from threading import Thread
    import subprocess
    import os
    
    def test():
        file = "/path/to/somefile.jpg"
        subprocess.call(["eog", file])
        os.remove(file)
    
    Thread(target = test).start()
    # the print command runs, no matter if the process above is finished or not
    print("Banana")
    

    这将完全按照您的描述进行:

    • eog(查看器)打开文件,等待它完成(关闭eog)并删除文件。
    • 同时继续执行脚本并打印“Banana”。

    【讨论】:

    • 非常感谢您的回答。但在这种情况下,它没有被放到后台,我无法继续工作。
    • 背景到底是什么意思?如果您希望脚本继续,请使用Threading
    • 是的,我希望脚本继续。我可能错过了严格定义它的确切词汇。如果我想在 Linux 终端中工作,我想要像nohup bash -c 'command1 && command2' & 这样的行为。 Threading真的有必要吗?
    • @mcocdawc 查看我的更新答案。要么使用subprocess.Popen() 以您的方式丢弃进程,要么让subprocess.call() 处理工作并等待进程完成。如果你想在此期间继续脚本,做其他事情,你需要使用threading
    • @mcocdawc:您可以使用process = Popen(['eog', path]) 而不是call(),以避免阻塞当前线程。要检查进程是否已退出,您可以call process.poll() later。或者你可以配置一个 SIGCHLD 信号,在进程退出时得到通知(这里是code example for a complicated case, the code in your case is likely to be much simpler)。
    猜你喜欢
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多