如何让我的python脚本等待shutil.move真正完成?

问题描述 投票:1回答:1

我正在使用的一个python脚本在某一点上将一个文件列表从一个目录移动到另一个目录。我已经用 shutil.move:

for a_file in list_of_filenames:
    src = os.path.join(src_dir, a_file)
    dest = os.path.join(dest_dir, a_file)
    shutil.move(src, dest)

紧接着,我把这个文件名列表写在一个命名的管道中,这个管道被插入我的主程序(用C语言编写)。然后它继续读取这些文件,假设它们已经到达了目标目录。问题是,如果我不告诉我的python脚本在向管道写入文件之前等待几秒钟,我的主程序就会卡住说其中一个文件确实存在。

根据我目前的研究,以及我对这个问题的有限理解,似乎操作系统可以通知我的脚本移动已经完成,而事实上它还没有实际完成。

现在,等待几秒钟听起来并不坏,但如果我必须移动100、1000甚至10000个文件呢?这就足够了,还是我必须等待更长时间?我到底该怎么做呢?确保 我的文件在处理之前已经被移动了?

目前我的想法是这样的。

was_moved = [False for _ in range(len(list_of_files))]
while not all(was_moved):
    for i, a_file in enumerate(files):
        if was_moved[i]:
            continue

        try:
            # try to open the file in read mode to see if it actually exists
            open_file = open(os.path.join(dest_dir, a_file), "r")
        except FileNotFoundError:
            continue

        open_file.close()
        was_moved[i] = True

这感觉就像一个笨拙的程序,虽然,我甚至不确定... ... open 是正确的测试文件,或者是运行循环所需的时间是使移动成功的原因。如果有什么见解或更好的想法来实现,欢迎大家提出。

python unix copy shutil
1个回答
1
投票

你可以使用subprocess.call()来调用一个命令行操作来实现你想要的东西。在子进程完成之前,它不会返回,这意味着你的文件已经移动了。

在Linux上:

import subprocess
for a_file in list_of_filenames:
    src = os.path.join(src_dir, a_file)
    dest = os.path.join(dest_dir, a_file)
    subprocess.call('mv ' + src + ' ' + dest)

在windows上:

import subprocess
for a_file in list_of_filenames:
    src = os.path.join(src_dir, a_file)
    dest = os.path.join(dest_dir, a_file)
    subprocess.call('move ' + src + ' ' + dest, shell=True)
© www.soinside.com 2019 - 2024. All rights reserved.