在与父脚本相同的线程中运行Mac应用程序

时间:2014-02-07 19:52:32

标签: python macos bash multiprocessing

非常具体的问题:我正在写一个应该

的(Python)脚本
  1. 生成一个临时文件。
  2. 启动图像查看器。
  3. 关闭查看器后,删除tmp文件。
  4. 在linux中,这样可以正常工作,因为我从Python打开一个子进程并运行以下

    eog myimg.png; rm myimg.png

    但是,Mac上的故事有所不同。 open命令在不同的进程中启动。如果我使用/Applications/Preview.app/MacOS/Preview,我会遇到一个奇怪的权限问题。如果我杀死我的脚本,离开文件,然后启动Terminal.app:

    ,这种情况仍然存在

    运行open myimg.png按预期工作。运行/Applications/Preview.app/MacOS/Preview myimg.png会获得相同的权限错误。 (意思是说 - 它实际上不是文件权限错误)。而FWIW,无论如何该文件是444。

    我的猜测是open命令运行来自不同用户的应用程序,允许访问我的用户未使用的父目录,就像这样。

    无论如何,任何人都知道到底发生了什么,以及可行的解决方案是什么?谢谢!

    修改 目前的代码是

    name = '/var/folders/qy/w9zq1h3d22ndc2d_7hgwj2zm0000gn/T/tmpDHRg2T.png'
    viewer_command = 'open'
    subprocess.Popen(viewer_command + ' ' + name +' ; rm ' + name, shell=True)
    

2 个答案:

答案 0 :(得分:0)

#!/bin/sh

TMP=$(mktemp sperry.XXXXXX.jpg)

echo "Made $TMP"

IMG="/Users/sean_perry/Pictures/Photo Booth Library/Pictures/Photo on 6-8-12 at 4.37 PM.jpg"

cp "$IMG" $TMP

open "$TMP"

rm $TMP

这个脚本在我的OSX机器上运行得很好。

也是如此
#!/usr/bin/python

import subprocess

subprocess.call(["open", "/Users/me/Pictures/Photo Booth Library/Pictures/Photo on 6-8-12 at 4.37 PM.jpg"])

你可以张贴你的吗?

答案 1 :(得分:0)

  

无论如何,任何人都知道到底发生了什么,以及可行的解决方案是什么?

如果没有更多详细信息(比如您的脚本运行方式以及您收到的错误消息),很难说肯定,但您的脚本可能是以与控制台用户不同的用户身份运行,或者没有在登录上下文中运行。

上下文是Mac OS X的一个不寻常的功能,并在Apple的Kernel Programming Guide ("Bootstrap Contexts")中有记录。简而言之,未从登录窗口下载的进程启动的进程(例如,通过SSH启动的进程)将无法访问该上下文中的服务(例如WindowServer)以启动桌面应用