我有运行子进程命令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)
上述两个过程彼此无关,目的不同。
当前结果是程序永远不会到达第二个子进程。它还在等待第一个子进程。
我该如何解决?
答案 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.listdir
和os.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
,可能需要提供配置设置或命令行参数才能使其正常进行守护。