在osx上的python中打开文件时阻塞调用

时间:2014-02-27 17:52:41

标签: python macos cocoa applescript subprocess

我在osx 10.9上使用python 2.7我想在他们的默认文件打开器中打开一个文件,如TextEdit for .txt文件,pdf opener for .pdf file等。 当文件打开时,它应该阻止,即我想打开一个文件并等待下一条指令的执行,直到文件没有关闭。我阅读了https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/open.1.htmlHow to open a file in subprocess on mac osx并使用了subprocess.call(["open","-W", FileName])。但在这种情况下,即使关闭打开的文件,我也必须手动强制从停靠位置退出文件开启工具。 因此,它也导致关闭先前打开的文件。  假设我打开了多标签文本编辑器,并运行我的应用程序。然后将在我已经运行的编辑器的选项卡中打开文本文件。然后我的程序将拒绝继续,直到我关闭所有选项卡,包括与我的任务无关的选项卡。那么,如何解决这个问题。当文件打开时,我通过线程中的看门狗处理文件中的更改,阻塞的原因。

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class ChangeHandler(FileSystemEventHandler):

    def on_any_event(self, event):
        myfunction(a, FileName, selectedFileName,b)

def filemonitor(FileName,tempLocation):

    while 1:
        global observer
        event_handler = ChangeHandler()
        observer = Observer()
        observer.schedule(event_handler, tempLocation, recursive=True)
        observer.start()
        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            observer.stop()
        observer.join()        

Thread(target=filemonitor,args=(FileName,tempLocation,)).start()    

subprocess.call(["open","-W", FileName])
observer.stop()

time.sleep(2)
os.remove(FileName) 

打开文件,阻止通话。然后听取变化。文件关闭后,删除文件

1 个答案:

答案 0 :(得分:0)

这是OSX的交易。它不会因为你“关闭”它而关闭应用程序。 OSX旨在加快并简化您所做的一切,除非您使用它做新的事情(打开一个打开应用程序的新文件或强行关闭它),它将离开应用程序。

你可以这样做:

from subprocess import Popen
handle = Popen('open -W ' + FileName, shell=True)

# Do some stuff
handle,terminate()

这会关闭应用程序 我真的不明白你究竟想要做什么,因为你的问题写得非常糟糕(不是说我的英语比较好)。但是如果你想等待应用程序终止,你可以这样做:

from time import sleep
while handle.poll() is None:
    sleep(0.025)
# do something after TextEditor has shut down

但话又说回来,你必须强行:从Dock中巧妙地关闭应用程序,因为再次...... OSX不会因为你按下关闭按钮而关闭应用程序。

你可以做的是:

from subprocess import Popen, STDOUT, PIPE

watchdog = Popen('iosnoop -f ' + FileName, shell=True, stdout=PIPE, stderr=STDOUT)
textfile = Popen('open -W ' + FileName, shell=True)

while watchdog.poll() is None:
    output = watchdog.stdout.readline()
    if 'close' in output.lower():
        break

textfile.terminate()
watchdog.terminate()
watchdog.stdout.close()

这会:

  • 打开一个I / O监听,打印有关OPEN,SEEK,CLOSE等所有关于文件名的信息
  • 使用您请求的文件打开texteditor
  • 如果IO Snoop中存在“CLOSE”,我们会关闭texteditor

这只是一个想法,但我用这种方式解决了OSX的类似问题 这也是dtraceiosnoopexecsnoop