python 修改vs工程属性

原创 2016年02月23日 12:03:40

有时候,在学习新技术的时候,或者在基于测试用例的开发新应用的时候,需要写很多工程,这些工程的属性配置基本都是一样,如,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

python 修改vs工程属性

有时候,在学习新技术的时候,或者在基于测试用例的开发新应用的时候,需要写很多工程,这些工程的属性配置基本都是一样,如,include头文件路径,lib路径,lib的input名字。新建一个工程,需要重...
  • freehyan
  • freehyan
  • 2016年02月23日 12:03
  • 461

在Windows下编译Caffe与其Python接口

因为毕设的原因,最近一直在研究Caffe,按照网上自己搭建Caffe的教程无果后,最终参考了happynear与虾米ning的帖子,但是其中遗漏了一些细节。所以特意写一篇文章来记录自己搭建Caffe的...
  • buildgood
  • buildgood
  • 2016年04月11日 17:13
  • 13952

VS2010 工程属性设置

工程property pages->configuration properties->general中设置 $(OutDir):              输出目录 $(IntDir):    ...
  • chenzhjlf
  • chenzhjlf
  • 2014年06月20日 14:40
  • 1019

vs2010统一修改所有工程的目录配置

vs2005和vs2008中都是通过 工具-选项-项目和解决方案-VC++目录,设置 头文件include 、库文件lib、可执行文件dll的路径,以便在引用dll动态链接库文件时,可以查找到该文件的...
  • u010251191
  • u010251191
  • 2015年09月05日 11:23
  • 1413

如何快糙好猛地在Windows下编译CAFFE并使用其matlab和python接口

零、最近更新2015/06/07 添加Insanity Layer(即randomized leaky rectified linear units),我也不知道为什么叫Insanity。。论文上说效...
  • happynear
  • happynear
  • 2015年04月29日 21:46
  • 81783

使用notepad++删除webrtc中的所有相关的vcxproj文件中有关ninja属性字段的定义

由于我下载的webrtc生成的工程师ninja-vs类型的工程,导致能够使用vs2015编辑器来编辑webrtc代码,但是工程的编辑器默认使用的是ninja而不是vs2015,这也就导致我这个属性vs...
  • malihong1
  • malihong1
  • 2016年11月25日 14:52
  • 390

VS 属性页修改当前项目和修改所有项目

这是VS2010的改变,不能够在“工具-选项”中看到“VC++目录”了。     但是呢,我们可以在另外一个地方找到它,请看下边的对比照片。 VS2008中:   VS...
  • MysticalRzc
  • MysticalRzc
  • 2017年02月15日 16:19
  • 219

VS项目配置属性

VS项目配置属性 疑问: 1.导入库? 2.依赖项 3.DLL VS lib 4. 参考: 1.VS项目属性的一些配置项的总结(important) 2..h头文件 .lib动态链接库文件...
  • xpwang168
  • xpwang168
  • 2014年02月13日 17:10
  • 902

如何快糙好猛地在Windows下编译CAFFE并使用其matlab和python接口

转发自:http://blog.csdn.net/happynear/article/details/45372231 一、准备   需要用到的东西我已经帮大家全部准备好了,有3月31日刚刚从ca...
  • tangwei2014
  • tangwei2014
  • 2015年05月08日 17:50
  • 2914

c++调用python脚本遇到的那些坑

问题一:一开始我是在qt上编写程序的,qt是32bit,但Python是64bit,在*.pro文件中配置了: INCLUDEPATH += C:/Python27/include/ LIBS +=...
  • JR_lu
  • JR_lu
  • 2017年01月06日 21:41
  • 3225
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python 修改vs工程属性
举报原因:
原因补充:

(最多只允许输入30个字)