主頁 > 知識庫 > Python .py生成.pyd文件并打包.exe 的注意事項說明

Python .py生成.pyd文件并打包.exe 的注意事項說明

熱門標簽:遼寧智能外呼系統(tǒng)需要多少錢 舉辦過冬奧會的城市地圖標注 400電話申請資格 螳螂科技外呼系統(tǒng)怎么用 正安縣地圖標注app qt百度地圖標注 地圖地圖標注有嘆號 電銷機器人系統(tǒng)廠家鄭州 阿里電話機器人對話

最近用python寫了一個小程序,想發(fā)布出去讓人試用又不想暴露源碼,搜索了一下發(fā)現(xiàn)將py文件編譯成pyd文件就能達到目的。

轉換過程很簡單,但是在調用pyd文件并且打包為單個exe文件的時候遇到一個坑,搞了一天才解決,在這里分享一下。

首先安裝cython庫

個人比較喜歡用清華的鏡像庫,速度快。

pip install Cyphton -i https://pypi.tuna.tsinghua.edu.cn/simple

然后創(chuàng)建一個setup.py文件

寫入以下內容:

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("BetaV14.py"))

BetaV14.py就是要轉換為pyd文件的代碼文件

命令行輸入:

python setup.py build_ext --inplace

會在.py文件目錄下生成一個BetaV14.cp37-win_amd64.pyd文件,文件名中“.cp37-win_amd64”這一段可以刪除,不刪除也可以正常調用;但原文件名字段不能改變。

接下來需要打包發(fā)布為.exe文件

我用的是pyinstaller,還是用清華鏡像庫安裝。

pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple

根據(jù)一些教程,有的說在命令行直接輸入:

pyinstaller -F BetaV14.py

就能直接引用pyd文件打包發(fā)布exe文件,但是在我這里出現(xiàn)文件缺失的錯誤:

ValueError: Module file F:\python項目1\BetaV14.py is missing

繼續(xù)查找問題,發(fā)現(xiàn)需要用一個入口程序來導入pyd文件,于是創(chuàng)建一個main.py文件,import剛才生成的模塊,pyd文件默認優(yōu)先級高于py文件,可以在后面解包exe文件來驗證。

import BetaV14
if __name__ == '__main__':
 BetaV14()

這里需要注意的是程序的__main__入口只能有一個,如果源py文件中有定義main入口,需要注釋掉并調整代碼縮進,否則通過main.py調用pyd文件遇到if name == ‘main':之后的代碼都不會運行。

接著命令行輸入:

pyinstaller -F main.py

打包成.exe文件,在dist目錄下發(fā)現(xiàn)main.exe文件大小只有5M,之前采用py文件打包的程序有接近50M,運行之后閃退。這個問題想了半天才想出來,可能是引用了大量的第三方庫沒有打包進去,于是將源py文件頭部import部分全部復制到main.py文件頭部。

import win32gui
import win32api
import win32con
import time 
import random
import datetime
import os,sys
import configparser
import numpy as np
from PIL import Image
from scipy.signal import convolve2d
import http.client
import subprocess
import BetaV14
if __name__ == '__main__':
 BetaV14()

再次用命令pyinstaller -F main.py打包,得到正常大小的.exe文件,點擊能正常運行。

接下來我們用pyinstxtractor.py(不清楚該腳本是否涉及著作權,請自行搜索)解包exe文件驗證一下,命令行輸入:

python pyinstxtractor.py main.exe

會得到一個main.exe_extracted文件夾,在文件夾下發(fā)現(xiàn)文件BetaV14.pyd,說明通過引用pyd文件打包成功。

在此作為一個初學者記錄一下自己遇到的坑,讓大佬們見笑了。

補充:python打包編譯成pyd或者_python之setup.py的那些事

今天偶然對setup.py產(chǎn)生了興趣,以前只知道可以用它來安裝包,例如

python setup.py build ->python setup.py install.當然前提你下載的這個源碼包是壓縮的,之前對這個理解并不深,今天偶然看見pip install -e . 的用法,然后串起來想了一下。

我的目錄結構如上,首先我創(chuàng)建了一個setuptutorial的directory,然后我在下面創(chuàng)建了greet_pkg的python package,并且在setuptutorial下面創(chuàng)建了setup.py如下

from setuptools import setup, find_packages
 
setup(
 name='greet',
 version='1.0.0',
 packages=find_packages(include=['greet_pkg', 'greet_pkg.*']),
 url='',
 license='uestc',
 author='jack',
 author_email='2444093230@qq.com',
 description='test package',
 py_modules=['greet2'],
 install_requires=['pyjokes']
)

greet2.py如下

def greet2(name):
 print(
 'hello',name,'this is greet2'
 )

在greet_pkg下面下了一個greet.py如下

import pyjokes
def greet(name):
 print('hello!', name, f'im telling you a joke {pyjokes.get_joke()}')

整體目錄結構和setup.py就如上所示

接下來好戲開場了,如果我要在任意其他文件里面使用到我定義的greet()方法,以前的做法是按照import規(guī)則在其他文件里面導入,當然如果寫的不規(guī)范,及其的容易出問題,這里我提供另外一個思路,在setuptutorial下面使用pip install -e . 命令,將setup.py里面包含的package和py_module安裝到Libary root下,當然他的實際的location不是在Libary root下,這個你可以在pip install -e . 之后使用pip show greet 查看他的信息.

到這里就完了嗎?

當然沒有,這個就是之前的python setup.py build 的作用,我這里猜測大概率是把tar.gz包轉化成我上述的目錄結構一樣的directory。

而python setup.py install 的作用就類似于pip install '-e' . 。而且python setup.py install 之后的greet包是真的存在于sitepackages里面的。

setup.py除了上述安裝包的作用,還可以是他的逆過程如 python setup.py sdist 成greet.tar.gz,這樣就有上述的裝包的過程先build再install。

還可以使用setup.py將py文件轉化為pyd,也可以說將pyx文件轉化為pyd,

from setuptools import setup
# from distutils.core import setup
from Cython.Build import cythonize
 
# setup(
# name='hello',
# ext_modules=cythonize(['sayhi.py'])
# )

然后運行python setup.py build_ext --inplace就可以了!

pyd文件可以很好的隱蔽py文件里面的實現(xiàn),和linux下的so文件類似。

有類似py->pyd功能的有easycython模塊,可以直接pip安裝。

有人可能會說pyc也看不見源碼嗎?

但是他可以被反編譯23333

至于如何將py編譯成pyc或pyo

可以使用py_compile或者compileall,不了解的可以自行搜索一下,都有很多的例子,還有針對pyc的反編譯庫,都可以搜到,至此setup.py我所了解的功能都談完了,里面還有很多參數(shù)可以靈活配置,實現(xiàn)更加炫酷的效果可以查看這個鏈接setup.py

您可能感興趣的文章:
  • Python打包為exe詳細教程
  • Python打包exe時各種異常處理方案總結
  • 將Python代碼打包成.exe可執(zhí)行文件的完整步驟
  • 如何利用pyinstaller打包Python程序為exe可執(zhí)行文件
  • python腳本打包后無法運行exe文件的解決方案
  • 解決python 打包成exe太大的問題
  • Python實現(xiàn)圖片指定位置加圖片水?。ǜ絇yinstaller打包exe)
  • Python三種打包exe方法案例教程

標簽:淘寶好評回訪 濟源 昭通 信陽 隨州 興安盟 阜新 合肥

巨人網(wǎng)絡通訊聲明:本文標題《Python .py生成.pyd文件并打包.exe 的注意事項說明》,本文關鍵詞  Python,.py,生成,.pyd,文件,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python .py生成.pyd文件并打包.exe 的注意事項說明》相關的同類信息!
  • 本頁收集關于Python .py生成.pyd文件并打包.exe 的注意事項說明的相關信息資訊供網(wǎng)民參考!
  • 推薦文章