我有以下的python代码。该代码应该从用户获取源,临时和最终输出路径并提取一些头文件。当从终端指定完整路径时,程序可以正常工作,但终端命令如下:
Python Get-iOS-Private-SDKs.py -p /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/PrivateFrameworks/ -t ./tmp -f ./Test.txt
,然后是头文件,而不是在当前目录的tmp文件夹中生成,它们进入递归循环。每个文件夹都有一个tmp文件夹,它会一直打开。谁能告诉我为什么?
import optparse,os,subprocess
from glob import glob
parser = optparse.OptionParser()
parser.add_option("-p","--path", help = "Source path", dest = "Input_Path", metavar = "PATH")
parser.add_option("-t","--temp",help = "Temporary Folder Path", dest = "Temp_Path", metavar = "PATH")
parser.add_option("-f","--file",help = "Destination Path",dest ="Output_Path",metavar = "PATH")
(opts,args) =parser.parse_args()
if (opts.Input_Path is None or opts.Output_Path is None or opts.Temp_Path is None):
print "Error: Please specify the necessary paths"
else:
os.makedirs(opts.Temp_Path + "Private_SDK")
dest = opts.Temp_Path + "Private_SDK/"
for root,subFolders,files in os.walk(opts.Input_Path):
for file in files:
os.makedirs(dest + file)
os.chdir(dest + file)
command = ['/opt/local/bin/class-dump','-H',os.path.join(root,file)]
subprocess.call(command)
该文件夹也不会被创建为Private_SDK,它被创建为tmpPrivate_SDK。基本上,如果我能够在提到./tmp时从终端获得完整路径,我可以让程序运行!
答案 0 :(得分:3)
os.makedirs获取相对路径(基于./tmp)并在调用chdir后调用(参见dest初始化和使用)
答案 1 :(得分:0)
如前所述,循环
for file in files:
os.makedirs(dest + file)
os.chdir(dest + file)
command = ['/opt/local/bin/class-dump','-H',os.path.join(root,file)]
subprocess.call(command)
是这个的来源。
相反,你应该
使用绝对路径 - 需要在使用wd = os.getcwd()
的所述循环之前获取当前工作目录,并以这种方式修改dest
,使其具有absdest = os.path.join(wd, dest)
并工作有了这个。 (此外,您应该使用os.path.join()
代替dest + file
更好地开展更多工作。
或在子进程调用后始终返回“旧”工作目录。在这里,您还需要wd = os.getcwd()
部分,之后需要os.chdir(wd)
。