Python 当另一个子流程仍在运行时调用它,是否可以?

Python 当另一个子流程仍在运行时调用它,是否可以?,python,subprocess,Python,Subprocess,我有python代码,它运行subprocess命令dtncpd,用于接收传入的所有文件 子流程调用([“dtncpd”,“/home/dtn2”],cwd=“/home/dtn2/dtn-2.9.0/apps/”,shell=“false”) dtncpd每次都必须运行。但是我也希望运行另一个子进程,而不中断一个文件python中的dtncpd子进程 另一个子流程,如: topik = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE,

我有python代码,它运行subprocess命令
dtncpd
,用于接收传入的所有文件

子流程调用([“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)
上述两个过程互不相关,目的不同

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


如何修复它?

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

subprocess.Popen(["dtncpd", "/home/dtn2"], cwd="/home/dtn2/dtn-2.9.0/apps/")
我删除了
shell=“false”
位,因为

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

就是这样做的:它等待子进程完成

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

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

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


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

FYI,
shell=“false”
的作用与您所希望的相反。非空字符串是“truthy”,因此您实际上传递了
shell=True
。如果要避免使用shell,请根本不要传递
shell
参数,或者传递
shell=False
(实际的布尔值,而不是字符串)。可以直接使用
os
模块中的函数更高效地完成基本posix命令的大部分功能,例如
ls
。在这里,您可以只使用
listdir
而不使用子进程。是的,
dtncpd
类似于守护进程。我试图在第一个命令中使用Popen,但仍然无法到达第二个进程。@RembulanMoon:daemon或not,
Popen()
应该返回,而不是阻塞。我提到daemonise是因为如果子进程要进行daemonise,
subprocess.call()
应该返回。但是
Popen()
不应该阻止。在第一次
Popen()
之后,您还执行了哪些其他代码?能否在每次调用Popen()(或call())后添加一条调试语句,以便查看哪个Popen()被阻塞(如果有的话)?谢谢,我尝试通过关闭pid来停止每次运行的Popen。所以现在它不会阻止另一个波本。
p1 = subprocess.Popen(["dtncpd","/home/dtn2"], cwd="/home/dtn2/dtn-2.9.0/apps/")