Python 如何从OSX.app包中的脚本获取打开文件的路径?

Python 如何从OSX.app包中的脚本获取打开文件的路径?,python,macos,Python,Macos,所以我有Foo.app,它被配置为在启动时运行Foo.app/Contents/MacOS/Foo.py。在应用程序的Info.plist文件中,我还将其设置为处理启动“.bar”文件的应用程序。双击.bar文件时,Foo.app会按预期打开 问题是,当以这种方式打开文件时,我无法在foo.py脚本中找到打开文件的路径。我以为它会在sys.argv[1]中,但事实并非如此。相反,sys.argv[1]包含一个奇怪的字符串,如“-psn\u 0\u 2895682” 有人知道我如何获得打开文件的绝

所以我有
Foo.app
,它被配置为在启动时运行
Foo.app/Contents/MacOS/Foo.py
。在应用程序的
Info.plist
文件中,我还将其设置为处理启动“.bar”文件的应用程序。双击.bar文件时,
Foo.app
会按预期打开

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


有人知道我如何获得打开文件的绝对路径吗?我还检查了操作系统环境,但它也不在那里。

您可以获取应用程序的进程ID,然后使用
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]

在运行代码中打开的文件可以以类似的方式显示: 从字符串导入* 从操作系统导入getpid 从子流程导入检查输出,标准输出 进口稀土

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

好办法,格雷格,我没想到。当然,必须有一个更直接的方法,为什么必须有一个更直接的方法?这是黑客行为!:-)嗯,我确实更喜欢干净和简单的方式,当它们可用时,但在这种情况下似乎没有任何。谢谢,我试试看。使用“lsof”可以为您提供一个Mac OS/Linux解决方案,但如果这很重要的话,可能无法在Windows上工作。因为不同的操作系统有不同的启动应用程序的方式,所以可能不可能找到一刀切的解决方案。当我的脚本运行时,它不会列出打开的文件。看来我得看看我是否可以应用其中一个技巧,从似乎是同一个问题对我来说。嗨,ma3,这看起来确实是同一个问题,虽然它似乎只有GUI工具包的支持,所以我在那里运气不好。我要试试格雷格的解决方案。