代码之家  ›  专栏  ›  技术社区  ›  Valentin B.

如何让python脚本等待shutil。实际完成的移动?

  •  3
  • Valentin B.  · 技术社区  · 7 年前

    我使用的一个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 是否正确测试文件,或者运行循环所需的时间是否是移动成功的原因。欢迎有任何见解或更好的想法来实现这一点。

    2 回复  |  直到 7 年前
        1
  •  7
  •   fmacdee    5 年前

    您可以使用子流程。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)
    
        2
  •  3
  •   A. Nielsen    3 年前

    我知道这是一个老问题,但我最近也遇到了这个问题。为了确保文件确实已移动,需要将更改同步到磁盘。自Python 3.3以来,Python对它有一个简洁的调用。

    os.sync()
    

    对于较早版本的python,您可以使用:

    from subprocess import check_call
    check_call(['sync'])