2010-11-22 55 views
2

所以我有Foo.app,它被配置为在启动时运行Foo.app/Contents/MacOS/foo.py。在应用程序的Info.plist文件中,我还将它设置为处理启动“.bar”文件的应用程序。当我双击.bar文件时,按预期打开Foo.app如何从OS X .app包中的脚本获取打开文件的路径?

问题是,当以这种方式打开文件时,我无法弄清楚如何在我的foo.py脚本中找到打开文件的路径。我以为它会在sys.argv[1],但事实并非如此。相反,sys.argv[1]包含一个奇怪的字符串,如“-psn_0_2895682”。

有谁知道我可以如何获得打开的文件的绝对路径?我也检查了os.environ,但它不在那里。

+0

[这个问题](http://stackoverflow.com/questions/849172/getting-the-name-of-document-that-used -to-launch-the-application-bundle-on-os-x)对我来说似乎是同样的问题。 – snapshoe 2010-11-22 03:36:46

+0

您好ma3,看起来像是同样的问题,虽然它看起来只支持GUI工具包,所以我在那里运气不好。我打算给Greg的解决方案一个镜头。 – 2010-11-22 05:08:29

回答

2

你可以得到那么你的应用程序的进程ID询问OS使用lsof,所有打开的文件,寻找你的进程ID:

from string import * 
from os import getpid 
from subprocess import check_output, STDOUT 

pid = getpid() 

lsof = (check_output(['/usr/sbin/lsof', '-p', str(pid)], stderr=STDOUT)).split("\n") 
for line in lsof[1:]: 
    print line 

的常规文件将'REG'型的第五列,[4]如果你在索引

文件打开内运行的代码可以显示在类似的方式:从 进口串* 从OS进口GETPID从子进口check_output ,STDOUT 进口重新

pid = getpid() 

f = open('./trashme.txt', 'w') 
f.write('This is a test\n') 

lsof = (check_output(['/usr/sbin/lsof', '-p', str(pid)], stderr=STDOUT)).split("\n") 
print lsof[0] 
for line in lsof[1:]: 
    if (re.search('trashme', line)): print line 

f.close 

导致:

COMMAND PID USER FD TYPE  DEVICE SIZE/OFF NODE NAME 
python 6995 greg 3w REG  14,2   0 2273252 /Users/greg/Desktop/trashme.txt 
+0

好的解决方案格雷格,我没有想到这一点。当然,有一个更直接的方法呢? – 2010-11-22 02:07:18

+0

为什么必须有更直接的方法?这是黑客! :-) – 2010-11-22 02:16:36

+0

嗯,当他们可用时,我更喜欢干净而简单的方式,但是在这种情况下看起来没有任何东西。谢谢,我会给它一个镜头。 – 2010-11-22 04:59:48

相关问题