Как получить путь к открытому файлу из сценария внутри пакета OS X.app? - PullRequest
2 голосов
/ 22 ноября 2010

Итак, у меня есть Foo.app, который настроен на запуск Foo.app/Contents/MacOS/foo.py при запуске.В файле приложения Info.plist он также установлен в качестве приложения для запуска файлов .bar.Когда я дважды щелкаю по файлу .bar, Foo.app открывается как положено.

Проблема в том, что когда файл открывается таким образом, я не могу понять, как получить путь к открытомуфайл в моем foo.py скрипте.Я предполагал, что это будет в sys.argv[1], но это не так.Вместо этого sys.argv[1] содержит странную строку, например "-psn_0_2895682".

Кто-нибудь знает, как я могу получить абсолютный путь к открытому файлу?Я также проверил os.environ, но его там тоже нет.

1 Ответ

2 голосов
/ 22 ноября 2010

Вы можете получить идентификатор процесса вашего приложения, а затем запросить у ОС все открытые файлы, используя lsof, ища идентификатор процесса:

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], если вы индексируете в.

Файлы, открытые в работающем коде, могут отображаться аналогичным образом: из строки импорта * из операционной системы импорт импорт 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...