【问题标题】:How to open a file in subprocess on mac osx如何在 mac osx 上的子进程中打开文件
【发布时间】:2013-11-10 10:53:37
【问题描述】:

我想打开一个文件并等待下一条指令的执行,直到文件没有关闭。我点击了链接How to open a file on mac OSX 10.8.2 in pythonpython,但它没有用。

subprocess.call(['open','-W',FileName]) 在 texteditor 中打开文件,但仅在 text-editor 强制从停靠栏退出时才执行下一条语句,即使我关闭了打开的文件。意思是,它应该仅在文件关闭时执行下一条语句,然后texteditor 应该会自动从停靠栏退出。
我也尝试过使用 Popen,但它不起作用

ss=subprocess.Popen("~/Downloads/DeletingDocs.txt",shell=True)
ss.communicate()   

请推荐一些方法

【问题讨论】:

  • 为什么你构建脚本的方式是必须等待另一个进程退出才能继续?几乎可以肯定有更好的方法来做到这一点。

标签: python macos applescript subprocess popen


【解决方案1】:

尝试将其保存为“EditOneAndQuit”,然后执行:

chmod +x EditOneAndQuit

然后从 Python 开始:

#!/bin/bash
# Start textedit in background
open "$1" &

# Wait till textedit has zero documents open
while true
do
sleep 1
docs=`osascript -e 'tell application "textedit" to get documents'`
if [ -z "$docs" ]; then
    # Kill off poor old textedit
    osascript -e 'tell application "textedit" to quit'
exit
fi
done

首先从 shell 中尝试,创建一个文档并对其进行编辑:

ls > fred.txt
./OpenOneAndQuit fred.txt

当您通过单击红色按钮关闭文档时,您应该会看到脚本以及 textedit 退出。

【讨论】:

  • 可以,可以包含在python脚本中,即。可以包含在python代码中。
  • 是的,使用 subprocess.call。您是否从终端尝试过,发现脚本一直在运行,直到您关闭文档然后退出?
  • subprocess.call(['/path/to/EditOneAndExit', '/path/to/yourDoc'])
  • subprocess.call(['/path/to/EditOneAndExit', '/path/to/yourDoc']) 导致错误,我在 '/path/to/yourDoc' 中包含了我的文件名路径。 '/path/to/EditOneAndExit' 中包含的内容。只有在打开的文件关闭时才打开文件并执行下一条指令。
  • 第一个参数是你保存我给你的脚本的完整路径。第二个参数是要编辑的文档的完整路径。您是否尝试按照我的建议从终端运行它?
【解决方案2】:

关闭文件并不会结束进程,因为当您关闭文件时,您会看到编辑器仍在屏幕顶部运行。

按“Cmd+Q”退出进程。

您似乎无法让您的用户区分关闭文档和关闭应用程序,我只能建议一些非常难看的东西。您能否启动另一个使用 Applescript 等到“textedit”启动的后台进程,然后向“textedit”询问它已打开的文档列表。如果有的话,睡几秒钟,然后再检查一次。如果没有,它可以告诉“textedit”退出并自己退出。

执行此操作的 Applescript 如下所示。

tell app "TextEdit" to get documents

您可能需要使用“osascript”来让 Python 执行 Applescript。

【讨论】:

  • 这可以通过代码来完成吗,因为任何用户在通过单击左侧红色按钮关闭文件时,都应该关闭文件并从扩展坞中删除文本编辑器,然后执行下一条指令。
  • 就像您通过文本编辑器打开任何文件一样。当您关闭打开的文件时,texteditor 也会自动从停靠栏中删除。在这种情况下,我们将能够通过单击任何文件一次打开多个文件
  • Mac 不是这样工作的。如果您在 Microsoft Word、Pages 或 TextEdit 中关闭文件,编辑器会继续运行。您可以在屏幕顶部看到 - 与您的文字处理器相关的所有菜单选项都保留在那里,并且文字处理器继续运行。就像我说的那样,尝试按“Cmd+Q” - 这是否符合您的要求?您不能真正以编程方式按“Cmd+Q”,因为您不知道用户何时完成编辑。他可以发出信号的唯一方法是关闭编辑器来停止进程,而不是关闭文件。
  • 好的,我很欣赏你的建议,但问题是 subprocess.call(['open','-W',FileName]) 当我从停靠栏强行退出文本编辑器时执行下一条指令。我想要做的是通过单击左侧红色按钮关闭文件时执行下一条指令,而不是从停靠区强行退出文本编辑器
  • 你告诉 Python 启动一个进程。它启动一个进程,并且在该进程结束之前不会做任何事情。您可以通过“强制退出”来结束进程,也可以使用“Cmd+Q”正确退出。仅在文字处理器中关闭一个文档(使用红色按钮)并不会结束该过程。
猜你喜欢
  • 2013-10-18
  • 2013-10-16
  • 2014-09-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多