当另一个进程仍在运行时调用子进程,它可以吗?

时间:2016-02-15 01:21:07

标签: python subprocess

我有运行子进程命令dtncpd的python代码,用于接收所有进入的文件。

subprocess.call(["dtncpd","/home/dtn2"], cwd="/home/dtn2/dtn-2.9.0/apps/", shell="false")

dtncpd必须每次都在运行。但我想在没有在一个文件python中插入dtncpd子进程的情况下运行另一个子进程。

另一个子流程如:

topik = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE, cwd="/home/dtn2/")
    komp, err = topik.communicate()
    kompserver = komp.split()
    cek = len(kompserver)

上述两个过程彼此无关,目的不同。

当前结果是程序永远不会到达第二个子进程。它还在等待第一个子进程。

我该如何解决?

2 个答案:

答案 0 :(得分:2)

subprocess.call是一个实用程序函数,在它返回之前运行然后等待进程。如果您希望进程在后台运行而不需要Python等待它完成,那么您需要使用原始Popen构造函数:

subprocess.Popen(["dtncpd", "/home/dtn2"], cwd="/home/dtn2/dtn-2.9.0/apps/")

我删除了shell="false"位,因为as I noted in the comments, it does the opposite of what you intend.

请注意,您的第二个子流程几乎肯定是错误的方法。在os.listdiros.stat之间(或者在Python 3.5上,单独使用os.scandir),您可以获得与使用子进程相比更高效的ls -l提供的相同信息。

答案 1 :(得分:2)

subprocess.call()的作用是什么:等待直到子进程完成。

您可以通过运行带Popen()的第一个命令来修复它:

p1 = subprocess.Popen(["dtncpd","/home/dtn2"], cwd="/home/dtn2/dtn-2.9.0/apps/")

由于您不需要与此过程进行通信(使用subprocess.call()不收集子输出),这应该没问题。

稍后,一旦第二个命令终止,您可以调用p1.wait()等待孩子退出 - 假设它会永远。这样可以防止创建僵尸dtncpd进程。

这可能有些天真,因为第一个命令看起来可能是守护进程。如果是这种情况,并且您只是想要启动dtncpd守护程序,则需要确保dtncpd实际上是守护进程。我不熟悉dtncpd,可能需要提供配置设置或命令行参数才能使其正常进行守护。