在osx上用python打开文件时阻止调用

2024-10-01 09:31:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我在OSX10.9上使用Python2.7,我想用默认的文件打开器打开一个文件,比如TextEdit for.txt文件,pdf opener for.pdf文件等等。 当文件被打开时,它应该被阻止,即我想打开一个文件,然后等待下一条指令的执行,直到文件没有被关闭。我读了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]),但在这种情况下,即使在关闭打开的文件时,我也必须从停靠位置手动强制退出文件打开器。 所以,它也会导致关闭以前打开的文件。 假设我打开了一个多选项卡文本编辑器并运行应用程序。然后文本文件将在我已经运行的编辑器的选项卡中打开。然后我的程序将拒绝继续,直到我关闭所有的标签页,包括那些与我的任务无关的标签页。那么,如何解决这个问题。当文件被打开时,我正在一个线程中通过watchdog处理文件中的更改,原因是阻塞。在

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) 

正在打开文件,阻止调用。然后倾听变化。关闭文件后,请删除该文件


Tags: 文件eventforpdfonmac标签open
1条回答
网友
1楼 · 发布于 2024-10-01 09:31:58

这是与OSX的交易。它不会仅仅因为“关闭”应用程序而关闭它。 OSX旨在加速和简化您所做的一切,因为它会使应用程序保持原样,除非您对它做一些新的操作(打开一个打开应用程序的新文件或强制关闭它)。在

您可以:

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

# Do some stuff
handle,terminate()

这将关闭应用程序。
我真的不明白你到底想做什么,因为你的问题写得很糟(并不是说我的英语更好)。但是如果您想等待应用程序终止,您可以:

^{pr2}$

但话说回来,你必须力:非常接近被告席上的申请,因为。。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嗅探器,它为给定的文件名打印有关打开、查找、关闭等的所有信息
  • 用您请求的文件打开文本编辑器
  • 如果IO嗅探中出现“CLOSE”,则关闭texteditor

这只是一个突然的想法,但我用OSX解决了类似的问题。
还有dtraceiosnoopexecsnoop

相关问题 更多 >