2010-11-09 109 views
2

我们有一个工作在这里工作,输入文件由SAS创建。该输入文件然后由遗留应用程序读取,并且遗留应用程序创建结果。 SAS然后读取结果并对其进行总结。非程序员通常会逐一处理这些操作。所以这个人只是创建输入文件。他们知道何时完成,然后他们运行遗留应用程序,并知道何时完成。然后他们运行汇总程序。如何检查一个文件是否在python中的窗口上打开?

我有一种情况,我的老板想跑100个左右的变化。我可以访问共享网络驱动器的3台或4台计算机。这是我的计划:使用计算机A,我开始逐个创建100个输入文件。使用计算机B,我在每个输入文件上运行传统程序。输入准备就绪后,我想开始运行程序。因此,如果在计算机A上完成input1的创建,我想在计算机B上的input1上运行遗留应用程序,同时在计算机A上创建input2。我知道python最好,所以我可能会使用python将所有这些粘合在一起。

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

对不起,很长的解释,但我只是不希望你浪费你的时间提供替代解决方案,我可能无法实现。

我已阅读此question及其答复。我不认为我可以使用任何类似lsof b/c的文件,这些文件将在不同的计算机上打开。

回答

2

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

+0

我决定使用这种方法。到目前为止我还没有遇到任何问题。我的Python代码基本上是循环直到文件存在,然后做一些东西。我可能会更喜欢并将每个组件的信号传递给对方,但我可能永远不会重新使用此代码。谢谢! – oob 2010-11-13 21:26:07

1

如果在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_var_x”批处理文件。您可以创建一些运行一系列处理步骤的主bat文件。每个步骤都会启动几个并行的3步骤变体。

+0

这很有趣。问题是我只有一台计算机上的传统程序的许可证,这恰好是我的个人计算机!好玩的东西。所以我计划在我的电脑上使用电脑B.但是,您的解决方案虽然可以工作,但速度并不像我想的那么快,但如果我走这条路线,我只会跑过夜。 – oob 2010-11-09 21:17:27

相关问题