如何运行可执行文件,然后在它停止后继续?



我想做的是将我正在运行的可执行文件写入的文件保存到 Dropbox 文件夹中。文件是随机保存的,所以我不能使用计时器。

我知道执行文件的唯一方法是非阻塞,当我运行函数时,它们只是执行并继续(例如,使用subprocess运行参数为可执行文件的start命令(。

我无法修改可执行文件,只能运行它。

这是我到目前为止尝试过的:我已经查找了这个问题,但没有找到任何东西。我知道用python执行某些东西的唯一方法是使用suprocess的call函数和Popen函数,并使用start命令来执行可执行文件。但这仍然是非阻塞的,并且在可执行文件开始而不是结束后继续。

我认为您想要以下内容;

# using module subprocess to pass arguments to and from an
# external program:
import subprocess
# put in the corresponding strings for
# "mycmd" --> external program name
# "myarg" --> arg for external program
# several args can be in the list ["mycmd", "myarg1", "myarg2"]
# might need to change bufsize
p = subprocess.Popen(["mycmd", "myarg"], bufsize=2048, shell=True,
stdin=subprocess.PIPE, stdout=subprocess.PIPE, close_fds=True)
# allow external program to work
p.wait()
# read the result to a string
result_str = p.stdout.read()

在这里,我只回答问题的标题。我不明白详细的描述。

subprocess.call()正在阻塞。

但是,仅在Windows块下使用start仅在启动程序所需的时间内使用,并且不会等待程序完成(如start文档中所述(

您可以查看start /wait(例如,在 CALL 命令中提到与 START with/WAIT 选项(

子进程在完成对文件的写入后需要以某种方式进行通信,以便父进程可以开始读取文件。

如果子进程在完成写入文件后终止,则可以wait()阻止,直到子进程完成。在更简单的情况下,您可以使用.run()方法。在更复杂的情况下,如果要同时等待多个进程,则可能需要使用 select(( 系统调用。

如果子进程未终止,则需要以其他方式检测已完成的写入。您可以通过解析命令的标准输出/错误来指示完成的关键字来执行此操作,或者您可以在预期的文件位置轮询文件系统并监视目录,直到新文件出现或未写入 x 秒。

我已经采用了这种方法,它不完全是我想要的,但它会做:

import subprocess
import time
load_files()
subprocess.run(['executable.exe'])
time.sleep(5)
while b'executable.exe' in subprocess.check_output('tasklist'):
time.sleep(1)
save_files()

相关内容

最新更新