Python os.walk 开场 apps/files

Python os.walk and opening apps/files

我正在尝试制作一个脚本,用于在应用程序目录中爬行并打开给定的文件。所以这是我的代码

import os, subprocess

os.chdir('/Applications')
root = '.'

for path, dirs, files in os.walk(root):
    #print path
    for f in files:
        if f == 'Atom':
            subprocess.call([f])
            break

所以我有三个问题。 起初我以Atom为例来执行脚本。它打开很好,但即使在打开应用程序后循环也不会中断并继续爬行。

其次,Atom 应用程序无法正常打开。它在应用程序文件夹的目录中打开,看起来像这样。

虽然它应该只是看起来像这样,

而且非常重要的问题是它不适用于我无法理解的任何其他应用程序。这是我尝试打开 AppStore 时的错误输出。

./App Store.app
./App Store.app/Contents
./App Store.app/Contents/_CodeSignature
./App Store.app/Contents/MacOS
Traceback (most recent call last):
  File "control_files.py", line 32, in <module>
    subprocess.call([f])
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 522, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 709, in __init__
    errread, errwrite)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1326, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

可能是什么问题?

前面的答案是关于 break 只退出最内层循环的。

另一种逃避循环的方法,可能更简洁,是将此功能隐藏在函数中并 return 远离它。大致如下:

def open_program(root, filename):
    for path, dirs, files in os.walk(root):
        if filename in files:
            full_path = os.path.join(path, filename)
            subprocess.call([full_path])
            return

使用 filename in files 的 IMO 使代码更清晰,并完成几乎相同的工作。