Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OSX:定义一个直接指向Python脚本的新URL处理程序_Python_Macos_Url_Handler - Fatal编程技术网

OSX:定义一个直接指向Python脚本的新URL处理程序

OSX:定义一个直接指向Python脚本的新URL处理程序,python,macos,url,handler,Python,Macos,Url,Handler,我试图在OSX下定义一个指向python脚本的新URL处理程序 我已经将Python脚本包装到一个小程序中(右键单击.py,然后打开->构建小程序) 我已将以下内容添加到小程序的Info.plist中: <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>Do My Th

我试图在OSX下定义一个指向python脚本的新URL处理程序

我已经将Python脚本包装到一个小程序中(右键单击.py,然后打开->构建小程序)

我已将以下内容添加到小程序的Info.plist中:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>Do My Thing</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>dmt</string>
        </array>
    </dict>
</array>
CbundleUrlTypes
将“dmt”指定为协议,但当我试图让它将协议链接到我的小程序时,它表示“将应用程序设置为帮助程序时出现问题”

有人知道我该去哪里吗


谢谢

经过一番周折,我终于在OSX下实现了这一点

我就是这样做的:

在AppleScript脚本编辑器中,编写以下脚本:

on open location this_URL
    do shell script "/scripts/runLocalCommand.py '" & this_URL & "'"
end open location
如果您想确保您是从某个shell运行Python(在我的例子中,我通常使用tcsh,并且有一个.tcshrc文件,该文件定义了我想要访问的一些环境变量),那么中间行可能是:

do shell script "tcsh -c \"/scripts/localCommand.py '" & this_URL & "'\""
我想在python脚本中完成所有实际处理,但由于OSX中URL处理程序的工作方式,它们必须调用应用程序包而不是脚本,因此在AppleScript中执行此操作似乎是最简单的方法

在脚本编辑器中,另存为“应用程序包”

找到保存的应用程序包,并打开内容。找到Info.plist文件并打开它。添加以下内容:

<key>CFBundleIdentifier</key>
<string>com.mycompany.AppleScript.LocalCommand</string>
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLName</key>
    <string>LocalCommand</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>local</string>
    </array>
  </dict>
</array>
第三个是处理程序ID——因此URL应该是local://something

因此,这将传递给Python脚本

这就是我所得到的:

#!/usr/bin/env python
import sys
import urllib
arg = sys.argv[1]
handler, fullPath = arg.split(":", 1)
path, fullArgs = fullPath.split("?", 1)
action = path.strip("/")
args = fullArgs.split("&")
params = {}
for arg in args:
    key, value = map(urllib.unquote, arg.split("=", 1))
    params[key] = value

我相信,你也可以使用py2app来删除AppleScript部分。你找到了更简单的方法吗?这似乎仍然是一个相当复杂的过程。此外,我正在用Python构建一个
.app
,它希望使用自定义回调协议回调对web服务进行授权。与只运行Python脚本不同,我希望在进行协议调用时应用程序的实例正在运行。我如何确保它被应用程序的打开实例处理?@fatuhoku应用程序需要检测到它已经在运行,并通过某种ipc转发请求。
com.mycompany.AppleScript.LocalCommand
LocalCommand
local
#!/usr/bin/env python
import sys
import urllib
arg = sys.argv[1]
handler, fullPath = arg.split(":", 1)
path, fullArgs = fullPath.split("?", 1)
action = path.strip("/")
args = fullArgs.split("&")
params = {}
for arg in args:
    key, value = map(urllib.unquote, arg.split("=", 1))
    params[key] = value