【问题标题】:How to pass path names to Python script by "dropping" files/folders over script icon如何通过在脚本图标上“删除”文件/文件夹来将路径名传递给 Python 脚本
【发布时间】:2011-11-18 16:01:14
【问题描述】:

我在 Mac OS X 中工作,并且一直在用 Python 编写简单的文件/文件夹复制脚本。有没有办法将文件夹拖放到 Python 脚本图标之上,并将文件或文件夹的路径作为参数传递给脚本?

目前,我有一个 AppleScript 小滴(支持拖放),它可以将放置的文件夹和文件的路径传递给 Python。但是,我希望只有一个 Python 脚本,而不是 AppleScript 和 Python 脚本。

任何帮助将不胜感激。

【问题讨论】:

    标签: python macos


    【解决方案1】:

    只需使用“构建小程序”实用程序:

    /Developer/Applications/Utilities/MacPython\ 2.5/Build\ Applet.app
    

    并且删除的文件路径将通过 sys.argv 可用。

    请注意,您可能必须使用 Python2.5(或补丁版本)-- 请参阅此说明:https://bitbucket.org/ronaldoussoren/py2app/issue/16/argv-emulation-code-needs-rewrite

    快速示例 -- 编辑此文件并将其放在桌面上:

    #!/usr/bin/python2.5
    import sys
    print sys.argv
    

    按住 Control 并单击它,然后选择使用“Build Applet (2.5.4)”打开

    应用程序图标将出现在桌面上。

    打开控制台实用程序并清除显示。

    将一些文件拖放到应用程序图标上——您将在控制台窗口中看到打印内容。

    【讨论】:

    • 非常感谢 Steven,这正是我所需要的。
    【解决方案2】:

    您可能真正喜欢的是 Mac OS 服务。它们是 Automator 工作流,可以以特定于上下文的方式很好地集成到操作系统中:例如当你选择一个文件夹时,你可以让你的脚本出现在 Finder 的上下文菜单中。

    您可以通过以下方式从 python 脚本创建服务:

    1. 打开 Automator.app 并创建一个新服务;
    2. 在工作流块顶部,您可以选择应用程序期望的输入类型(如果我理解正确,您可以选择文件夹);
    3. 将“运行 Shell 脚本”块从左侧窗格拖到工作流中;
    4. 现在您可以使用默认的 bash shell (/bin/bash) 来调用您的脚本:

      /full/path/to/your/python /full/path/to/your/script.py $@
      

    5. 或使用/usr/bin/python(默认python)并将代码直接粘贴到文本块中;

    6. 别忘了在区块右上角设置Pass input: as arguments

    调试这样的工作流程有点棘手(因为您不会看到 stdout 和 stderr)。调试的可能解决方法是设置自定义 excepthook 并将所有异常输出到一些纯文本文件中:

    import sys, traceback
    
    def excepthook(type, exc, tb):
        with open("error.log", "a") as f:
            traceback.print_exc(file=f)
    
    sys.excepthook = excepthook
    

    【讨论】:

    • 非常感谢您的帮助,丹。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2020-10-06
    • 2019-10-22
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多