Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在osx上用python打开文件时阻止调用_Python_Macos_Cocoa_Applescript_Subprocess - Fatal编程技术网

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

在osx上用python打开文件时阻止调用,python,macos,cocoa,applescript,subprocess,Python,Macos,Cocoa,Applescript,Subprocess,我在osx 10.9上使用Python2.7,我想在默认的文件开启器中打开一个文件,比如.txt文件的TextEdit、.pdf文件的pdf开启器等。 当文件打开时,它会阻塞,即我想打开一个文件并等待下一条指令的执行,直到文件未关闭。我阅读并使用了子进程.call([“open”,“-W”,FileName])。但是在这种情况下,即使在关闭打开的文件时,我也必须手动强制从dock位置退出文件开启器。 因此,它也会导致关闭以前打开的文件。 假设我打开了一个多选项卡文本编辑器并运行我的应用程序。然后

我在osx 10.9上使用Python2.7,我想在默认的文件开启器中打开一个文件,比如.txt文件的TextEdit、.pdf文件的pdf开启器等。 当文件打开时,它会阻塞,即我想打开一个文件并等待下一条指令的执行,直到文件未关闭。我阅读并使用了
子进程.call([“open”,“-W”,FileName])
。但是在这种情况下,即使在关闭打开的文件时,我也必须手动强制从dock位置退出文件开启器。 因此,它也会导致关闭以前打开的文件。
假设我打开了一个多选项卡文本编辑器并运行我的应用程序。然后文本文件将在我已经运行的编辑器的选项卡中打开。然后我的程序将拒绝继续,直到我关闭所有选项卡,包括那些与我的任务无关的选项卡。那么,如何解决这个问题呢。当文件打开时,我通过线程中的看门狗处理文件中的更改,这是阻塞的原因

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) 

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

以下是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 snoop,它打印给定文件名的所有关于打开、查找、关闭等的信息
  • 打开包含所需文件的文本编辑器
  • 如果IO Snoop中存在“CLOSE”,我们将关闭文本编辑器
这只是一个出人意料的想法,但我用这种方式解决了OSX的类似问题。

还有一个问题,

为什么不继续下一步,不管用户对打开的文件做什么?对我来说,这似乎是一个用户敌对的设计。假设我打开了一个多选项卡文本编辑器并运行您的应用程序。您的文本文件将在我已经运行的编辑器的选项卡中打开。然后你的程序将拒绝继续,直到我关闭所有选项卡,包括那些与你的任务无关的选项卡。是的,这就是我面临的问题。这就是我问这个问题的原因。我希望,若我通过关闭红色标记来关闭打开的文件,那个么该过程将继续,而无需强制退出文件开启器。您清楚地了解我的问题,现在知道如何解决它了。假设我打开了一个多选项卡文本编辑器并运行我的应用程序。然后文本文件将在我已经运行的编辑器的选项卡中打开。然后,我的程序将拒绝继续,直到我关闭所有选项卡(强制退出),包括那些与我的任务无关的选项卡。那么,如何解决这个问题呢。@winterfall你没有,我想你是在把自己设计成一个陷阱。但在最好的情况下,您可以使用我在回答中编写的最后一段代码。一旦特定文件关闭,它将继续应用程序(无论编辑器是否为选项卡式)。。。但是您可能想放弃
textfile.terminate()
,除了代码应该可以之外。我检查了这两个代码。在上面的看门狗代码中,在output.lower()的if'close'中的第8行,获取错误为
回溯(最近一次调用):File“/Users/IMP/Documents/workplace/Desk/moniterTest.py():AttributeError:'NoneType'对象没有属性'lower'
。甚至我的代码也只有在我强制退出文本编辑时才会终止。我的要求是,只要单击红色的关闭按钮关闭打开的文件,阻塞调用就完成了,然后执行下一条指令。不需要强制退出文件开启器。不关心文件开启器是否还在后面运行。我只想通过红色的关闭按钮关闭打开的文件。不等待关闭文件开启器application@winterfall试试密码好吗P这与关闭应用程序无关,这与文件有关,每当文件关闭时(应用程序仍可运行),此代码将继续执行。。。