【问题标题】:How would I open and close another application with a python script?如何使用 python 脚本打开和关闭另一个应用程序?
【发布时间】:2018-09-19 09:17:03
【问题描述】:

我想在 Preview 中打开一个现有的 pdf 并在 TextEdit 中打开一个文本文件(将被编辑或不被编辑),等待一些输入,然后关闭两个窗口(并让该过程重复)。

在 Mac OS 上执行此操作的最佳方法是什么? subprocess.call(['open', '-a', 'TextEdit', filename]) 工作正常,但我不确定如何终止用户输入的进程。

编辑:我正在打开这个过程:

txt=subprocess.Popen(['open','-a','/Applications/TextEdit.app/','path_filename'])
user_input = raw_input("Continue? Enter 'quit' to exit")
txt.kill()  # nothing happens
if user_input.lower() == 'quit':
    break

【问题讨论】:

  • 您如何知道用户已完成输入文本?你想整体做什么?可能有更好的方法...
  • 用户是否应该通过在 TextEdit 中输入文本或其他方式来评论 PDF?还是要将文本从 TextEdit 复制到 PDF 中?

标签: macos python-2.7 subprocess


【解决方案1】:

据我所知,您想要实现的目标是不可能的。除非您能找到一种方法来捕获外部程序中的字符事件。

我宁愿建议您在 Python 中创建自己的 GUI(图形用户界面),例如通过wxPython,然后在其中嵌入wx.TextCtrl,这样您将拥有更多控制权(例如,很容易捕获多种类型的KeyEvents)。

但是,要关闭您示例中的应用程序,我会执行以下操作:

retrieve_pid_1 = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
retrieve_pid_2 = subprocess.Popen(['grep', '-m1', 'TextEdit'], stdin=retrieve_pid_1.stdout, stdout=subprocess.PIPE)
retrieve_pid_3 = subprocess.Popen(['awk', '{print $1}'], stdin=retrieve_pid_2.stdout, stdout=subprocess.PIPE)
process_number = retrieve_pid_3.communicate()[0].decode('ASCII').rstrip()
kill_process = subprocess.Popen(['kill', process_number])

【讨论】:

  • 我将如何创建一些简单的东西来打开两个文件等待一个键然后关闭两个文件(并重复)。
【解决方案2】:

更新答案

从您的 cmets 看来,Python 应用程序实际上并不需要知道用户检查 PDF 的结果,只需要知道他何时完成检查。

AFAIK,最简单的方法是使用 TextEdit 的脚本功能每隔一秒左右向它询问打开文档的列表。然后你可以等到用户关闭你为他打开的文档,它就会从列表中消失。

脚本可能看起来像这样,称为GetTextEditDocumentList

#!/bin/bash
osascript -e 'tell app "TextEdit" to get documents'

它将在其stdout 上打印一个打开的文档列表,您可以使用 Python 阅读该列表。或者你可以将文件名作为参数传递给它,它可以循环,中间有 1 秒的延迟,直到该文件/文档不再打开。

您可以在终端中尝试使用 TextEdit 打开和关闭一些文档,看看它是如何工作的。


原答案

您似乎正在尝试使用TextEdit 来获取有关预览中可见的 PDF 的一些文本(可能是评论),而文本输入对话框可能更合适。

虽然您可以安装并强制任何用户安装 TkinterwxPython,但实际上您可以非常简单地使用 macOS 中内置的 Applescript,无需安装任何东西。

所以,将以下内容另存为dialog

#!/bin/bash
input=$(osascript <<EOF
tell application "System Events" 
   display dialog "Enter something:" default answer "Some default answer" with title "Gimme da thing" buttons {"Okey dokey"}
end tell
EOF
)
echo $input

并使其可执行:

chmod +x dialog

然后会弹出如下对话框:

输出是:

./dialog 
button returned:Okey dokey, text returned:No, I refuse

然后您可以非常简单地从 Python 调用它,使用:

subprocess.Popen(['dialog'],stdout=subprocess.PIPE)

当然,如果您需要比我编写的静态标题更灵活,您可以参数化标题、提示和默认文本并将它们传递给脚本。

【讨论】:

  • 我正在尝试将 pdf 中的数据与文本文件中的数据进行比较。所以我的目标是让两个文件并排打开,进行比较(手动),然后在下一组打开之前关闭。
  • 好的,那么你怎么知道用户已经比较并准备好下一个文件了?
  • 我打算让它等待用户的输入(例如,当准备好继续时按回车键(在 cmd 行中))。
  • 那么你怎么知道文件内容是否相同呢?
  • 我知道了那部分,但是你的程序怎么知道比较的结果是什么?
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
相关资源
最近更新 更多