如何用python检查文件是否已打开以在windows上写入?

如何用python检查文件是否已打开以在windows上写入?,python,windows,Python,Windows,我们有一个由SAS创建输入文件的过程。然后,该输入文件由遗留应用程序读取,该遗留应用程序创建结果。SAS然后读取结果并对其进行汇总。非程序员通常会逐个处理这些操作。因此,用户只需创建输入文件。他们知道何时完成,然后运行遗留应用程序,并且知道何时完成。然后他们运行摘要程序 我有一个情况,我的老板想运行大约100个变体。我可以访问共享网络驱动器的3或4台计算机。这是我的计划:使用计算机A,我开始创建100个输入文件,一个接一个。使用计算机B,我在每个输入文件上运行遗留程序。我想在输入就绪时开始运行程

我们有一个由SAS创建输入文件的过程。然后,该输入文件由遗留应用程序读取,该遗留应用程序创建结果。SAS然后读取结果并对其进行汇总。非程序员通常会逐个处理这些操作。因此,用户只需创建输入文件。他们知道何时完成,然后运行遗留应用程序,并且知道何时完成。然后他们运行摘要程序

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

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

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


我读过这篇文章及其回应。我认为我不能使用像lsof b/c这样的任何东西。这些文件将在不同的计算机上打开。

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

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

不是真的

Windows将允许您多次打开该文件,并真的会把事情搞砸

您必须使用一些显式同步。我不想以100种不同的方式同步这三个步骤中的每一个,我的首选是执行以下操作。制作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文件,以运行一系列处理步骤。每一步都会启动几个并行的三步变体。

这很有趣。问题是,我只有一台计算机上的遗留程序的许可证,而这台计算机恰好是我的个人计算机!有趣的东西。所以我打算把我的电脑设为B电脑。虽然你的解决方案会奏效,只是速度没有我想要的那么快,但如果我走这条路,我会在晚上跑步。我决定使用这种方法。到目前为止,我还没有遇到任何问题。我的python代码基本上是忙循环,直到文件存在,然后做一些事情。我可能会得到更高级的代码,并将信号从每个组件传递给其他组件,但我可能永远不会重复使用此代码。谢谢