【问题标题】:How can I run a bash executable from a python script with the same i/o?如何从具有相同 i/o 的 python 脚本运行 bash 可执行文件?
【发布时间】:2016-08-26 23:47:38
【问题描述】:

所以,我要做的是从我在 shell 中执行的 python 脚本执行一个程序。我已经阅读了其他问题,所以我可以这样做:

def bash(cmd):
    subprocess.Popen(cmd, shell=True, executable='/bin/bash')
bash('./my/file')

现在第一个问题是我经常想从 shell 中终止程序。通常,如果我从终端执行“./my/file”,我可以用 ctrl+c 停止它。但是使用子进程以某种方式在后台运行它,我只能通过命令“top”杀死它,并在 bash 中通过 pid 杀死它。但是该程序生成大量进程的速度如此之快,以至于我无法以合理的方式以这种方式杀死它。

另外,我想做的第二件事是等待程序完成运行,然后再执行更多我的 python 脚本。我试过设置...

process=subprocess.Popen(cmd, shell=True, executable='/bin/bash')
process.wait()

但这实际上在程序启动后几乎立即停止。

我可以单独执行脚本,但我看不到在不创建第三个脚本的情况下使用程序结果的方法,我必须在原始 python 脚本之后自己运行然后程序完成。 有什么建议吗?

【问题讨论】:

    标签: python bash shell executable


    【解决方案1】:

    对于您的第一个问题,请尝试preexec_fn 参数:

    import signal
    import ctypes
    libc = ctypes.CDLL("libc.so.6")
    def set_pdeathsig(sig = signal.SIGTERM):
        def callable():
            return libc.prctl(1, sig)
        return callable
    p = subprocess.Popen(args, preexec_fn = set_pdeathsig(signal.SIGTERM))
    

    这将确保由subprocess.Popen 产生的所有子进程将在父进程退出后立即自动退出。所以你只需要杀死python进程。

    第二个问题,试试communicate方法:

    process=subprocess.Popen(cmd, shell=True, executable='/bin/bash', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = process.communicate()
    

    它将在您的 python 进程和它的子进程之间建立一个管道,通过该管道可以将输入数据传递给子进程并返回结果。如果不调用communicate方法,一般进程会在后台运行,结果如果存在则丢弃。

    通过调用communicate方法,父进程会在这里阻塞,等待子进程完成。 outerr分别代表子进程的正常输出和错误输出。您可以使用它来获取 bash 脚本的输出。

    【讨论】:

    • 感谢您的回答,我突然有点忙,所以我只检查了第二个,它有点工作,因为它正确地从程序中获取输出,但有时会阻止程序正在运行。
    猜你喜欢
    • 1970-01-01
    • 2019-11-13
    • 2021-10-20
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多