首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在另一个进程仍在运行时调用子进程,可能吗?

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

Stack Overflow用户
提问于 2016-02-15 09:21:07
回答 2查看 1.1K关注 0票数 2

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

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

dtncpd必须每次都在运行。但我也想运行另一个子进程,而不会中断一个文件dtncpd中的Python子进程。

另一个子流程,如:

代码语言:javascript
复制
topik = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE, cwd="/home/dtn2/")
    komp, err = topik.communicate()
    kompserver = komp.split()
    cek = len(kompserver)

以上两个过程互不相关,目的也不同。

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

我怎么才能修复它?

EN

回答 2

Stack Overflow用户

发布于 2016-02-15 09:51:46

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

代码语言:javascript
复制
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上),您可以获得与ls -l提供的信息相同的信息,效率比使用子进程更高。

票数 3
EN

Stack Overflow用户

发布于 2016-02-15 09:52:57

这就是subprocess.call()所做的:它等待到子进程完成。

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

代码语言:javascript
复制
p1 = subprocess.Popen(["dtncpd","/home/dtn2"], cwd="/home/dtn2/dtn-2.9.0/apps/")

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

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

这可能有点幼稚,因为第一个命令看起来可能是一个守护进程。如果是这种情况,并且您只是想启动dtncpd守护进程,则需要确保dtncpd确实执行守护进程。我不熟悉dtncpd,您可能需要提供一个配置设置或命令行参数,以便正确地对其进行守护。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35400147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档