我想做的是将我正在运行的可执行文件写入的文件保存到 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()