如何在python中检查文件在Windows上是否打开?

时间:2010-11-09 20:06:26

标签: python windows

我们在这里有一个进程,其中输入文件由SAS创建。然后,遗留应用程序将读取该输入文件,并且该遗留应用程序将创建结果。然后,SAS读取结果并对其进行总结。非程序员通常会逐个处理这些操作。所以这个人只是创建输入文件。他们知道什么时候完成,然后他们运行遗留应用程序,他们知道什么时候完成。然后他们运行摘要程序。

我的情况是我的老板想要运行大约100种变体。我可以访问共享网络驱动器的3台或4台计算机。这是我的计划:使用计算机A,我开始逐个创建100个输入文件。使用计算机B,我在每个输入文件上运行遗留程序。我想在输入准备好后开始运行程序。因此,如果在计算机A上创建了input1,我想在计算机B上的input1上运行遗留应用程序,而在计算机A上创建input2。我最了解python,所以我可能会使用python将所有这些粘合在一起。

现在我知道我可以做很多事情,但我认为这种方法已经足够,并且可以让我暂时完成工作。我没有时间设计和测试一个非常优雅的解决方案,它可以利用所有机器上的所有核心或使用数据库来帮助我同步所有这些。我很欣赏这样的建议,但是我真的只想知道在python中是否有办法判断网络驱动器上的文件是否可以被任何计算机上的任何应用程序写入?如果不,我可能会想出一个愚蠢的方法来创建一个指示作业已完成 - 比如创建一个文件“doneA”,如果存在,则表示“input1”文件已完成。例如。我会在sas程序中添加一个步骤,在创建输入文件后创建指示文件。

很抱歉这个很长的解释,但我不想让你浪费时间提供我可能无法实现的替代解决方案。

我已阅读此question及其回复。我不认为我可以使用像lsof b / c这样的文件在不同的计算机上打开。

2 个答案:

答案 0 :(得分:2)

将输出写入临时文件。写完后,关闭它,然后将其重命名为其他程序正在等待的名称。这样,文件只有在准备好被读取时才会出现。

答案 1 :(得分:1)

  

如果在python中有一种方法可以判断网络驱动器上的文件是否已打开以供任何计算机上的任何应用程序写入?

不是。

Windows会让你多次打开文件并真正搞砸了。

您必须使用一些显式同步。不是以不同的方式同步三个步骤中的每一个,我的偏好是执行以下操作。制作100份三步舞。不要担心步骤之间的同步。

for variant in range(100):
    name= "variant_{0}.bat".format(variant)
    with open(name,"w") as script:
        print( "run some SAS thing", file=script )
        print( "run some legacy thing", file=script )
        print( "run some SAS thing", file=script )
    subprocess.Popen( "start {0}".format(name), shell=True )

我怀疑这会通过并行运行所有100来破坏处理器的生命。

实际上,您可能不希望在Python中实际使用subprocess.Popen()。实际上,您可能想要创建几个可以并行运行几个变体的“start variant_x”批处理文件。您可以创建某种运行一系列处理步骤的主bat文件。每个步骤都会启动几个并行的三步变体。