2010-11-22 52 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

相關問題