如何在Python中检查Windows上的文件是否可写?
我们这里有一个工作流程,首先是用SAS创建一个输入文件。然后,这个输入文件会被一个老旧的应用程序读取,接着这个应用程序会生成一些结果。最后,SAS会读取这些结果并进行总结。通常情况下,这些步骤都是由一个不懂编程的人一个一个地完成的。他们会先创建输入文件,知道文件完成后再运行老旧的应用程序,等这个程序运行完后,再运行总结程序。
现在我遇到一个情况,我的老板希望我运行大约100个不同的版本。我有3到4台共享网络驱动器的电脑可以使用。我的计划是:在电脑A上,我开始一个一个地创建这100个输入文件。在电脑B上,我会对每个输入文件运行老旧的程序。我希望在输入文件准备好时就开始运行程序。所以,如果电脑A上的输入文件input1创建完成,我想在电脑B上运行input1的老旧应用程序,同时在电脑A上继续创建input2。我对Python比较熟悉,所以我可能会用Python把这些步骤连接起来。
我知道有很多方法可以做,但我觉得这个方法足够了,能让我暂时完成工作。我没有时间去设计和测试一个非常优雅的解决方案,比如利用所有机器的多个核心,或者使用数据库来帮助我同步这些操作。我很感激大家的建议,但我其实只想知道,在Python中,有没有办法判断网络驱动器上的文件是否被任何电脑上的应用程序打开以进行写入? 如果没有,我可能会想出一个简单的方法来创建一个完成的指示,比如创建一个文件“doneA”,如果这个文件存在,就意味着“input1”文件已经完成。例如,我会在SAS程序中添加一个步骤,在输入文件创建完成后生成一个指示文件。
抱歉解释得这么长,但我不想浪费你们的时间提供我可能无法实施的替代方案。
我已经看过这个问题及其回复。我觉得我不能使用像lsof这样的工具,因为这些文件会在不同的电脑上打开。
2 个回答
有没有办法在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()
。更实际的做法是创建几个“启动变体_x”的批处理文件,这样可以并行运行几个变体。你可以创建一个主批处理文件,按顺序运行处理步骤。每个步骤可以启动几个并行的三步变体。
把输出写到一个临时文件里。当写完后,先把这个文件关闭,然后把它改名为另一个程序正在等待的名字。这样的话,文件只有在准备好被读取的时候才会出现。