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