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

2024-04-20 07:06:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

上述两个过程互不相关,目的不同。在

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

我怎样才能修好它?在


Tags: apps文件代码命令home进程callsubprocess
2条回答

subprocess.call是一个实用函数,它运行并等待进程返回。如果希望进程在后台运行而不需要Python等待它完成,则需要使用rawPopen构造函数:

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(或者仅在python3.5上,os.scandir)之间,您可以获得与{}相比使用子进程更有效的相同信息。在

这就是^{}所做的:它等待直到子进程完成。在

您可以使用Popen()运行第一个命令来修复它:

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

因为您不需要与此进程通信(使用subprocess.call()不收集子输出),所以这应该没问题。在

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

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

相关问题 更多 >