【问题标题】:open any applications in mac like vlc, chrome, terminal from python script在 mac 中打开任何应用程序,例如从 python 脚本中的 vlc、chrome、终端
【发布时间】:2019-11-26 09:45:50
【问题描述】:

我正在编写一个脚本,如果我说“打开 vlc”,那么它应该打开 vlc 应用程序,如果我说“打开 chrome”,那么它应该打开 google chrome。为此,我尝试了以下方式,但我得到了permission denied issue,并且我正在做的方式是手动处理每个应用程序。有没有其他方法可以打开任何 mac 应用程序?

if 'open vlc' in query:
    subprocess.call(['/Applications/VLC.app'])
if 'open chrome' in query:
    subprocess.call(['/Applications/Google Chrome.app'])

# open system preferences, notes as well

【问题讨论】:

    标签: python python-3.x macos automation


    【解决方案1】:

    OS X 使用的 Bash 终端实际上​​有 open 命令,它应该与子进程一起使用:

    subprocess.call(["open", "-a", "ApplicationName"])
    

    根据我的经验,这使用 /Applications/ 作为应用的默认位置。另见the man page for the open command

    在你的情况下,我建议在你的程序中输入一个字典或有效的应用程序名称,这样可以吐出程序的实际可执行名称:

    valid_programs = {
        "vlc": "VLC"
        "chrome": "Google Chrome"
    }
    

    要制作通用的“打开”语句,您可以使用正则表达式来识别命令的形式并捕获他们试图打开的名称,然后与 valid_programs 交叉引用:

    import re
    ...
    app_name_query = re.match(r"open (.*)\b", query):
    if app_name_query:
        try: 
            subprocess.call(["open", "-a", valid_programs[app_name_query.group(1)]])
        except KeyError:
            print(f"I didn't recognize the program {app_name_query.group(1)}!")
    

    (您可能需要稍微更改正则表达式调用以匹配您的查询使用的任何格式 - see the documentation 了解有关如何执行此操作的详细信息)

    【讨论】:

      【解决方案2】:

      那是因为/Applications/Google Chrome.app 是一个目录。你肯定没有运行目录的权限。

      你可以打开/Applications/<Application name>.app/Contents/MacOS/<Application name>而不是/Applications/<Application name>.app

      >>> import subprocess
      >>> subprocess.run('/Applications/Google Chrome.app/Contents/MacOS/Google Chrome')
      CompletedProcess(args='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', returncode=0)
      

      完整版:

      import subprocess
      
      
      apps = {'vlc': 'VLC', 'chrome': 'Google Chrome'}
      
      command = input()
      if command.startswith('open '):
          try:
              app = apps[command[len('open '):]]
              subprocess.run('/Applications/' + app + '.app/Contents/MacOS/' + app)
          except KeyError:
              print('Unknown application:', command[len('open '):])
          except FileNotFoundError:
              print(app, 'is not installed.')
      

      您还可以使用module re in the Python standard library 将命令与regular expression 匹配。

      顺便说一句,Python 标准库中还有一个名为 cmd 的模块,用于解释面向行的命令。

      【讨论】:

        猜你喜欢
        • 2022-08-03
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        相关资源
        最近更新 更多