【问题标题】:Running a command completely indepenently from script [duplicate]从脚本完全独立地运行命令[重复]
【发布时间】:2013-09-19 08:32:37
【问题描述】:

我最近遇到了一些情况,我想完全独立地启动命令,并且在与脚本不同的进程中,相当于将其键入终端,或者更具体地说,将命令写入 .sh 或 .desktop 和双击它。我的要求是:

  • 我可以在不关闭应用程序的情况下关闭 python 窗口。
  • python 窗口不显示应用程序的标准输出(您不希望在 CLI 中出现随机文本),我也不需要它!

我尝试过的事情:

  • os.system 等待。
  • subprocess.call 等待。
  • subprocess.Popen 启动一个子进程 (duh) 关闭父进程从而退出应用程序

这基本上就是您可以在网络上找到的所有内容! 如果它真的归结为它,我可以启动一个 .sh(或 Windows 的 .bat),但这感觉就像一个廉价的黑客,而不是这样做的方法。

【问题讨论】:

    标签: python bash subprocess


    【解决方案1】:

    如果您在从 os.system 调用时在命令后放置 & ,那会不会起作用?例如:

    import os
    os.system( "google-chrome & disown " )
    

    【讨论】:

    • 如果python退出,子进程也可能退出。不过,添加 nohup 可能会做到这一点。
    • 添加nohup 或在& 之后添加disown
    • 跨平台性如何?
    【解决方案2】:

    使用 fork 和 exec 以“UNIX 方式”生成子进程。这是 Python 中的一个简单的 shell 示例。

    import os
    
    prompt = '$ '
    while True:
        cmds = input(prompt).split()
        if len(cmds):
            if (os.fork() == 0):
                # Child process
                os.execv(cmds[0], cmds)
            else:
                # Parent process
                # (Hint: You don't have to wait, you can just exit here.)
                os.wait()
    

    【讨论】:

    • 如果我仍然需要为 windows 做其他事情但我会尝试一下,这似乎有点复杂
    • 这很好用,我只是将 os.execv(cmds[0], cmds) 行更改为 os.system(cmds) 并删除了 .split()。可悲的是,由于所有这些都不适用于 Windows,因此“命令和拒绝”更容易。
    【解决方案3】:
    import subprocess
    import os
    with open(os.devnull, 'w') as f:
        proc = subprocess.Popen(command, shell=True, stdout=f, stderr=f)
    

    【讨论】:

    • 感谢您阅读我的作品。 :) 这会产生一个子进程,而不是一个完整的进程
    • 也许我不明白你的问题。当这不能满足您的要求时,您能举个例子吗?
    • 这会打开一个子进程。如果父进程以代码 0 退出,那很好,但是当我以另一种方式杀死它时,比如关闭终端,它也会退出子进程
    • 这很奇怪。如果我使用command = 'ls -lRa / > /tmp/out',我可以运行脚本,关闭终端,打开一个新终端,ps axu | grep ls 显示ls -lRa 仍在运行。
    猜你喜欢
    • 2019-01-19
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多