【问题标题】:Running python script in Mac OSX launchd permission issue在 Mac OSX 中运行 python 脚本启动权限问题
【发布时间】:2020-04-01 17:12:59
【问题描述】:

我有一个简单的 python 脚本,它正在从我的下载文件夹中移动文件。当我通过终端运行该脚本时,它运行良好。当它通过launchd运行时会发生问题:

Traceback (most recent call last):
  File "/Users/ben/Project/Automation/CleanDownload.py", line 11, in <module>
    for f in listdir(downloadFolder):
OSError: [Errno 1] Operation not permitted: '/Users/ben/Downloads/'

知道为什么吗?

【问题讨论】:

    标签: python macos launchd macos-catalina


    【解决方案1】:

    这是我用来规避此问题的解决方法。我试图运行一个简单的 shell 脚本,但同样的解决方法也适用于 Python 脚本。总而言之,所涉及的步骤是:

    • 创建一个名为例如 automator 的应用程序。 run-script.app 有一个 bash 脚本,它运行传递给它的任何文件
    • 要么通过Security & Privacy 提供全自动应用程序Full Disk Access,要么手动运行一次并在macOS 提示权限时单击允许
    • 使用您要运行的任何脚本调用自动化应用程序

    更多细节:

    • 无论您要运行什么脚本,请确保它是可执行的(使用chmod +x)并且您在脚本顶部有正确的#! 行(例如#!/bin/bash)。在此示例中,我将使用~/scripts/organize-screenshots.sh 的脚本将屏幕截图从我的桌面移动到我的 Google Drive 目录:
    #!/bin/bash
    user_dir="/Users/soxley"
    
    find "$user_dir"/Desktop -name 'Screen Shot *.png' -exec mv {} "$user_dir"/Google\ Drive/pictures/screenshots/ \;
    
    • 接下来,创建一个 Automator 应用程序:
      • 打开 Automator
      • 点击新建文档
      • 选择应用程序
      • 点击选择
      • 选择实用工具>运行Shell脚本
      • 选择传递输入:作为参数
      • 输入/bin/bash -c "$1" 作为脚本的主体(见下面的截图)
      • 点击文件>保存并将应用程序保存在您想要的任何位置(本例中为run-script.app
    • 接下来,运行刚刚手动创建的应用程序以确保它具有所需的权限(您也可以在安全和隐私中授予新应用程序全磁盘访问权限强>):
      • 打开Terminal.app
      • 执行命令open -a run-script.app organize-screenshots.sh
      • 当 macOS 询问应用程序是否可以访问您的桌面时,单击允许
    • 现在您已准备好在launchd 中配置您的脚本。使用以下 ProgramArguments 更新您的 .plist:
    <key>ProgramArguments</key>
    <array>
      <string>open</string>
      <string>-a</string>
      <string>/Users/soxley/scripts/run-script.app</string>
      <string>/Users/soxley/scripts/organize-screenshots.sh</string>
    </array>
    

    现在您应该能够使用此应用程序作为包装器来运行您想要的任何脚本。

    【讨论】:

    • 我必须添加 --args 才能将脚本名称传递给 run-script.app。
    • Automator 脚本有效且具有完全访问权限,但 launchd 仍然没有。你能提供其余的设置或链接吗? (有太多不同的说明) - 编辑:它确实有效!我的错误不是使用用户库路径~/Library/LaunchAgents/,而是/Library/LaunchAgents/。谢谢!
    【解决方案2】:

    您是否尝试过授予/sbin/launchd 全盘访问权限?

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 感谢您提到的答案,它在终端上运行良好。当我从 launchd 运行它时,问题就出现了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 2018-12-25
      • 2010-12-12
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多