思路是先將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....