【问题标题】:Blocking call while opening a file in python on osx在osx上的python中打开文件时阻止调用
【发布时间】:2014-03-31 08:24:58
【问题描述】:

我在 osx 10.9 上使用 python 2.7 我想在它们的默认文件打开器中打开一个文件,例如用于 .txt 文件的 TextEdit、用于 .pdf 文件的 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])。但是在这种情况下,即使在关闭打开的文件时,我也必须从停靠位置手动强制退出文件打开器。 因此,它也会导致关闭先前打开的文件。 假设我打开了一个多选项卡文本编辑器并运行我的应用程序。然后文本文件将在我已经运行的编辑器的选项卡中打开。然后我的程序将拒绝继续,直到我关闭所有选项卡,包括那些与我的任务无关的选项卡。那么,如何解决这个问题。打开文件时,我正在线程中通过看门狗处理文件中的更改,阻塞的原因。

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) 

打开文件,阻塞调用。然后听变化。当文件关闭时,然后删除文件

【问题讨论】:

  • 为什么不继续下一步,不管用户对打开的文件做了什么?这对我来说似乎是一个用户敌对的设计。假设我打开了一个多选项卡文本编辑器并运行您的应用程序。您的文本文件将在我已经运行的编辑器的选项卡中打开。然后,您的程序将拒绝继续,直到我关闭所有选项卡,包括与您的任务无关的选项卡。
  • 是的,这就是我面临的问题。这就是我问这个问题的原因。我希望如果我通过关闭红色标记来关闭打开的文件,然后继续处理而不需要强行退出文件打开器。您清楚地了解我的问题,现在如何解决它。

标签: python macos cocoa applescript subprocess


【解决方案1】:

这是与 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 等的所有信息
  • 使用您请求的文件打开文本编辑器
  • 如果 IO Snoop 中存在“CLOSE”,我们将关闭文本编辑器

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

【讨论】:

  • 假设我打开了一个多标签文本编辑器并运行我的应用程序。然后文本文件将在我已经运行的编辑器的选项卡中打开。然后我的程序将拒绝继续,直到我关闭所有选项卡(强制退出),包括那些与我的任务无关的选项卡。那么,如何解决这个问题。
  • @winterfall 你没有,国际海事组织你正在把自己编入一个陷阱。但在最好的情况下,您使用我在回答中编写的最后一个代码。一旦该特定文件关闭,它将继续应用程序(无论编辑器是否被选项卡)...但是您可能想放弃textfile.terminate(),除了代码应该没问题。
  • 我检查了两个代码。在上面的看门狗代码中,得到错误为Traceback (most recent call last): File "/Users/IMP/Documents/workplace/Desk/moniterTest.py", line 8, in <module> if 'close' in output.lower(): AttributeError: 'NoneType' object has no attribute 'lower'。甚至我的代码也只有在我强制退出 TextEdit 时才会终止。我的要求是只要我通过单击红色关闭按钮关闭打开的文件,然后阻塞调用完成,然后执行下一条指令。不需要强制退出文件打开器。不关心文件打开器是否仍在运行。
  • 我只想等待通过红色关闭按钮关闭打开的文件。不等待关闭文件打开器应用程序
  • @winterfall 试试看代码好吗? :P 这与关闭应用程序无关,这与文件有关,只要文件关闭(应用程序仍然可以运行),此代码将继续执行...
猜你喜欢
  • 2013-10-18
  • 2013-10-16
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2018-01-06
相关资源
最近更新 更多