我想要做的是将我正在运行的可执行文件编写的文件保存到Dropbox文件夹中。这些文件是随机保存的,所以我不能使用计时器。
我知道执行文件的唯一方法是无阻塞的,并且当我运行函数时,它们只是执行并继续(例如,使用subprocess
来运行start
命令,参数是可执行文件)。
我无法修改可执行文件,只能运行它。
这是到目前为止我尝试过的事情:我已经查找了问题,却没有发现任何问题。我知道使用python执行某些操作的唯一方法是使用suprocess的call
函数和Popen
函数,并使用start
命令执行可执行文件。但这仍然是非阻塞的,并且在可执行文件开始执行而不是结束执行之后继续进行。
答案 0 :(得分:0)
我认为您想要以下内容;
# 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()
答案 1 :(得分:0)
在这里,我只是回答问题的标题。我不了解详细说明。
subprocess.call()
被阻止。
但是,在Windows下使用start
仅在启动程序所需的时间内阻止,而不会等待程序完成(如start
的文档中所述)
您可能会看start /wait
(例如CALL command vs. START with /WAIT option中提到的内容)
答案 2 :(得分:0)
子进程完成对文件的写入后,需要以某种方式进行通信,以便您的父进程可以开始读取文件。
如果子进程在完成文件写入后终止,则可以wait()
进行阻塞,直到子进程完成。在较简单的情况下,可以使用.run()
方法。在更复杂的情况下,如果要同时等待多个进程,则可能需要使用select()系统调用。
如果子进程没有终止,则需要以其他方式检测完成的写入。您可以通过解析指示完成的关键字的命令的标准输出/错误来做到这一点,或者可以在预期的文件位置轮询文件系统并查看目录,直到出现新文件或尚未将其写入。 x秒。
答案 3 :(得分:0)
我已经采用了这种方法,这并不是我想要的,但是它会做到:
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()