python 修改vs工程属性

有时候,在学习新技术的时候,或者在基于测试用例的开发新应用的时候,需要写很多工程,这些工程的属性配置基本都是一样,如,include头文件路径,lib路径,lib的input名字。新建一个工程,需要重写非常麻烦,vs能配置一个通用的,但是其他工程中又不需要这些的环境,所以突发想法写个脚本批处理vs这些属性。这里使用python修改当前目录下所有.vcvproj工程属性。

使用.notepad打开vcxproj工程文件,可以发现这是一个.xml文件,第一行声明了其文件编码格式为utf-8。但是这里需要注意的是这个文件的格式是utf-8-BOM,而在用python文件读取vcFile = open(fileName, encoding="utf-8"),在后面使用python的print或者read函数会出错,所以我们需要去除bom头文件最开始的3个字节。

def removeBom(file):
    BOM = b'\xef\xbb\xbf'
    existBom = lambda s: True if s==BOM else False

    f = open(file, 'rb')
    if existBom( f.read(3) ):
        fbody = f.read()
        #f.close()
        with open(file, 'wb') as f:
            f.write(fbody)

其次的就是递归查询当前目录下的.vcxproj文件。文件名分隔格式为os.path.splitext(filename)[1] == '.vcxproj',会把文件分为两半。找到的文件名添加到list中,后面的for循环就可以处理相应路径下的文件。

fileList = []
for dirpath, dirnames, filenames in os.walk("."):
    for filename in filenames:
        #print(filename)
        if os.path.splitext(filename)[1] == '.vcxproj':
            filepath = os.path.join(dirpath, filename)
            #print("file:" + filepath)
            fileList.append(filepath)
print(fileList)

接下来观察.vcxproj的文件格式,在指定位置添加我们想添加的东西就可以了。
vcxproj属性部分

修改文件就是智者见智了,我修改的openscenegraph的属性样例,把相应的文件属性改成自己所需就好。

# coding=utf-8
import os
import sys
import codecs

def removeBom(file):
    BOM = b'\xef\xbb\xbf'
    existBom = lambda s: True if s==BOM else False

    f = open(file, 'rb')
    if existBom( f.read(3) ):
        fbody = f.read()
        #f.close()
        with open(file, 'wb') as f:
            f.write(fbody)

fileList = []
for dirpath, dirnames, filenames in os.walk("."):
    for filename in filenames:
        #print(filename)
        if os.path.splitext(filename)[1] == '.vcxproj':
            filepath = os.path.join(dirpath, filename)
            #print("file:" + filepath)
            fileList.append(filepath)
print(fileList)

for i in range(len(fileList)):
    #traverse file list
    fileName = fileList[i]
    print(fileName)
    removeBom(fileName)   
    vcFile = open(fileName, encoding="utf-8")

    fileContent = ""
    Count = 1
    while True:
        textLines = vcFile.readline()
        if not textLines:
            break;
        #print(textLines)

    # debug infomation
        debugStr = "</PreprocessorDefinitions>"
        debugPos = textLines.find(debugStr)
    #add debug include info    
        if (debugPos != -1):
            debugPos += len(debugStr)
            addIncludeContent= "\n      <AdditionalIncludeDirectories>$(OSG_ROOT)\include;</AdditionalIncludeDirectories>"
            textLines = textLines[:debugPos] + addIncludeContent + textLines[debugPos:]    

            nextText = vcFile.readline()
            if nextText.find("AdditionalIncludeDirectories") == -1:                   
                fileContent += textLines;     
                fileContent += nextText;
                print("exceed to adding include")
                continue;
            else:
                fileContent += textLines
                print("exceed to adding include")               
                continue;

    #add debug lib and input info
        libStr = "<GenerateDebugInformation>true</GenerateDebugInformation>"
        libPos = textLines.find(libStr);

        if (libPos != -1):
            libPos += len(libStr)
            addLibContent = "\n      <AdditionalLibraryDirectories>$(OSG_ROOT)/lib2012;</AdditionalLibraryDirectories>\n      <AdditionalDependencies>osgd.lib;osgDBd.lib;osgViewerd.lib;osgUtild.lib;osgGAd.lib;</AdditionalDependencies>"
            addLibContentRea = "\n      <AdditionalLibraryDirectories>$(OSG_ROOT)/lib2012;</AdditionalLibraryDirectories>\n      <AdditionalDependencies>osg.lib;osgDB.lib;osgViewer.lib;osgUtil.lib;osgGA.lib;</AdditionalDependencies>"
            if Count == 1:
                textLines = textLines[:libPos] + addLibContent + textLines[libPos:] 
            else:
                textLines = textLines[:libPos] + addLibContentRea + textLines[libPos:] 

            nextLibText = vcFile.readline()
            nextInputText = vcFile.readline()                   
            print(nextLibText)
            print(nextInputText)

            if nextLibText.find("AdditionalLibraryDirectories") != -1:
                if nextInputText.find("AdditionalDependencies") == -1:
                    fileContent += textLines
                    fileContent += nextInputText
                elif nextInputText.find("AdditionalDependencies") != -1:
                    fileContent += textLines        
            else:
                if nextLibText.find("AdditionalDependencies") != -1:
                    fileContent += textLines
                    fileContent += nextInputText
                elif nextInputText.find("AdditionalDependencies") == -1:
                    fileContent += textLines
                    fileContent += nextLibText
                    fileContent += nextInputText                    

            print("exceed to add lib and input")
            Count += 1
            continue;

        fileContent += textLines;

    newFile = open(fileName, "w+", encoding="utf-8")
    newFile.write(fileContent)  
    newFile.close()    
    vcFile.close;

os.system("pause")

【参考资料】:
【1】http://www.runoob.com/python/python-functions.html
【2】http://www.ymsky.net/views/34601.shtml
【3】http://www.jb51.net/article/63247.htm

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中级Python软件工程师题库是一个专门用于考察中级Python软件工程师技能的题库,旨在评估应聘者的基本知识、编程能力和解决问题的能力。以下是一些可能包含在中级Python软件工程师题库中的问题和题型。 1. 请解释Python中的列表和元组之间的区别。 列表和元组都是Python中常用的数据结构,它们的主要区别在于: - 列表是可变的,可以通过修改、删除、添加元素来改变列表的内容。而元组是不可变的,一旦创建就不能修改。 - 列表使用方括号([])来表示,元组使用圆括号(())来表示。 2. 请解释Python中的深拷贝和浅拷贝。 深拷贝和浅拷贝都是用于在Python中复制对象。 - 浅拷贝是创建一个新对象,该对象与原始对象的基本数据类型属性具有相同的值。如果原始对象包含引用类型的属性,浅拷贝将共享这些属性的引用。 - 深拷贝创建一个全新的对象,该对象与原始对象的所有属性(包括引用类型属性)都具有相同的值。深拷贝不共享原始对象的任何属性。 3. 请解释Python中的装饰器。 装饰器是Python中的一种函数,它可以用来修改其他函数的功能。装饰器本身接受一个函数作为参数,并返回一个新函数,新函数通常会对原函数进行一些额外的处理或封装。 4. 请解释Python中的异常处理机制。 Python的异常处理机制用于捕获和处理程序运行时发生的错误。通过使用try-except语句块,可以捕获并处理可能导致程序崩溃的错误,从而增加代码的健壮性和可靠性。 5. 请解释Python中的迭代器和生成器。 迭代器和生成器都是用于对数据进行遍历的工具。 - 迭代器是一个对象,它实现了用于在序列(如列表或字符串)上进行迭代的方法。通过调用iter()函数,可以将可迭代对象转换为迭代器。 - 生成器是一种特殊的迭代器,它可以使用yield关键字来逐次生成值。生成器可以通过函数来定义,并且每次生成一个值后都会暂停执行,直到下一次迭代。 以上只是一些可能出现在中级Python软件工程师题库中的问题,这些问题旨在评估应聘者对Python的基本知识的掌握程度以及解决问题的能力。具体的题目和要求可能会因公司和职位的不同而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值