Pythonスクリプトで使用するPythonライブラリのパッケージ化方法[C++埋め込みPython]

2328 ワード

説明:
私が今やっていることは、C++プログラムにPythonスクリプトを埋め込み、Python実行環境がインストールされていないpcでC++プログラム(Pythonスクリプトが内蔵されている)を実行する必要があります.私の現在のマシンはPython環境がインストールされています.
実装方法:
この場合、私のPythonスクリプトをPythonライブラリに使用してパッケージ化し、他のマシンでこれらのライブラリを正しく呼び出すことができます.1つの乱暴な方法はPython環境下のすべてのPythonライブラリをパッケージ化することですが、80 M以上のパッケージが得られます.こんな大きなものをプログラムに置くのはどうしても不快だ.
そこで考えを変えます:使ったライブラリを梱包すればいいです.以下のPythonコードはリファレンスライブラリの自動パッケージングを実現できます

######################################
#          pyc    
#            
def getModulesPath():
    lst = []
    #sys.modules     ,      :
    #{'site': ,
    for v in sys.modules.itervalues() :
        s = str(v)
        if "from" in s:
            data = s.split("'")
            lst.append(data[-2])
        else :
            print "module : ", s
    return lst

#    
def extractFiles(destDir, files):
    destDir.replace("/", "\\")
    if destDir[-1] != '\\' :
        destDir += '\\'

    for f in files :
        dest = filiterPath(destDir, f)
        copyF(dest, f)

#             
def filiterPath(destDir, srcFile):
    dest = destDir
    maxLen = 0
    for path in sys.path:
        lenp = len(path)
        if lenp < len(srcFile) and path == srcFile[:lenp]:
            if maxLen < lenp:
                dest = destDir + srcFile[lenp+1:]
                maxLen = lenp

    dest.replace("/", "\\")
    if '.' in dest: #     
        p = dest.rfind('\\')
        if p >= 0:
            dest = dest[:p]
    return dest

#    
#         ,   
def copyF(destDir, srcFile):
    if not os.path.isfile(srcFile):
        print "error : file %s not exist!" % srcFile
        return False
    if not os.path.isdir(destDir):
        os.mkdir(destDir)
        print "make dir:", destDir
    try:
        shutil.copy2(srcFile, destDir)
        print "copy file : %s to %s" % (srcFile, destDir)
    except IOError:
        print "error : copy %s to %s faild" % (srcFile, destDir)
        return False
    return True

def test():
    a = getModulesPath()
    extractFiles("testpg\\", a) #         testpg   

このコードをPythonスクリプトの最後に追加し、C++でtest()を呼び出せばOKです
注意:上のパッケージコードは他の人から引用され、ソースアドレスは覚えていません.