Python 專案轉化為so檔案

2021-09-13 21:03:42 字數 4337 閱讀 8470

思路是先將py轉換為c**,然後編譯c為so檔案,所以要安裝以下內容:

python 安裝:cython

pip install cython
linux 安裝:python-devel,gcc

yum install python-devel

yum install gcc

新建test.py檔案,內容如下

class

test

:def

__init__

(self)

:print

('init'

)def

say(self)

:print

('hello'

)

新建setup.py,內容如下

from distutils.core import setup

from cython.build import cythonize

setup(ext_modules = cythonize(

["test.py"])

)

在bash中執行

python setup.py build_ext
執行後會生成build資料夾,如下

現在so檔案就可以像普通py檔案一樣匯入了

做了以下內容:

1.資料夾編譯

2.刪除編譯出的.c檔案

3.刪除編譯的temp資料夾

將需要編譯的目錄和setup.py放在同一層級,執行python setup.py,so檔案在build目錄下

setup.py**如下:

'''

created on 2023年3月27日

@author: hylink

'''#-* -coding: utf-8 -* -

"""執行前提:

系統安裝python-devel 和 gcc

python安裝cython

編譯整個當前目錄:

python py-setup.py

編譯某個資料夾:

python py-setup.py bigomodel

生成結果:

目錄 build 下

生成完成後:

啟動檔案還需要py/pyc擔當,須將啟動的py/pyc拷貝到編譯目錄並刪除so檔案

"""import sys, os, shutil, time

from distutils.core import setup

from cython.build import cythonize

starttime = time.time(

)currdir = os.path.abspath(

'.')

parentpath = sys.ar**[1]

iflen

(sys.ar**)

>

1else

""setupfile= os.path.join(os.path.abspath(

'.')

, __file__)

build_dir =

"build"

build_tmp_dir = build_dir +

"/temp"

defgetpy

(basepath=os.path.abspath(

'.')

, parentpath=

'', name=

'', excepts=()

, copyother=

false

,delc=

false):

""" 獲取py檔案的路徑

:param basepath: 根路徑

:param parentpath: 父路徑

:param name: 檔案/夾

:param excepts: 排除檔案

:param copy: 是否copy其他檔案

:return: py檔案的迭代器

"""fullpath = os.path.join(basepath, parentpath, name)

for fname in os.listdir(fullpath)

: ffile = os.path.join(fullpath, fname)

#print basepath, parentpath, name,file

if os.path.isdir(ffile)

and fname != build_dir and

not fname.startswith(

'.')

:for f in getpy(basepath, os.path.join(parentpath, name)

, fname, excepts, copyother, delc)

:yield f

elif os.path.isfile(ffile)

: ext = os.path.splitext(fname)[1

]if ext ==

".c"

:if delc and os.stat(ffile)

.st_mtime > starttime:

os.remove(ffile)

elif ffile not

in excepts and os.path.splitext(fname)[1

]notin(

'.pyc'

,'.pyx'):

if os.path.splitext(fname)[1

]in('.py'

,'.pyx'

)and

not fname.startswith(

'__'):

yield os.path.join(parentpath, name, fname)

elif copyother:

dstdir = os.path.join(basepath, build_dir, parentpath, name)

ifnot os.path.isdir(dstdir)

: os.makedirs(dstdir)

shutil.copyfile(ffile, os.path.join(dstdir, fname)

)else

:pass

#獲取py列表

module_list =

list

(getpy(basepath=currdir,parentpath=parentpath, excepts=

(setupfile)))

try:

setup(ext_modules = cythonize(module_list)

,script_args=

["build_ext"

,"-b"

, build_dir,

"-t"

, build_tmp_dir]

)except exception as e:

print

(e)else

: module_list =

list

(getpy(basepath=currdir, parentpath=parentpath, excepts=

(setupfile)

, copyother=

true))

module_list =

list

(getpy(basepath=currdir, parentpath=parentpath, excepts=

(setupfile)

, delc=

true))

if os.path.exists(build_tmp_dir)

: shutil.rmtree(build_tmp_dir)

print

("complate! time:"

, time.time(

)-starttime,

's')

1.編譯後執行需要相同的python版本和編碼

2.py中使用__file__內建變數的檔案編譯後呼叫時會出問題,暫時沒有解決,還需要使用pyc代替

3.使用時注意許可權控制

將python專案轉化為so檔案

1.安裝gccsudo apt get build dep gcc 安裝cythonpip install cython 2.編譯整個目錄 將需要編譯的目錄和setup.py放在同一層級,執行python setup.py setup.py 如下 coding utf 8 author arvin ...

動態檔案轉化為靜態檔案

using system.data.sqltypes using system.data.sqlclient using system.io string title demo stringbuilder sb new stringbuilder 注意這裡使用到了變數 連線資料庫 using sql...

xml檔案轉化為datatable

asp.net 新建xml檔案,程式碼如附件 annie female 25 tom male 28 lily female 22後台寫轉換方法 private static datatable xmltodatatable string xml foreach xmlnode xx in doc....