最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年03月04日 09:01:23   作者:L**  
這篇文章主要介紹了Python .py生成.pyd文件并打包.exe 的注意事項說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

首先安裝cython庫

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

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

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

寫入以下內(nèi)容:

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”這一段可以刪除,不刪除也可以正常調(diào)用;但原文件名字段不能改變。

接下來需要打包發(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入口,需要注釋掉并調(diào)整代碼縮進,否則通過main.py調(diào)用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時間序列按頻率生成日期的方法

    python時間序列按頻率生成日期的方法

    這篇文章主要介紹了python時間序列按頻率生成日期的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Python實現(xiàn)文件及文件夾操作大全

    Python實現(xiàn)文件及文件夾操作大全

    在日常工作或生活中,總避免不了需要操作文件或文件夾,本文主要介紹了Python實現(xiàn)文件及文件夾操作大全,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • 使用python調(diào)用瀏覽器并打開一個網(wǎng)址的例子

    使用python調(diào)用瀏覽器并打開一個網(wǎng)址的例子

    這篇文章主要介紹了使用python調(diào)用瀏覽器并打開一個網(wǎng)址的例子,使用webbrowser模塊實現(xiàn),需要的朋友可以參考下
    2014-06-06
  • Python?數(shù)據(jù)可視化實現(xiàn)5種炫酷的動態(tài)圖

    Python?數(shù)據(jù)可視化實現(xiàn)5種炫酷的動態(tài)圖

    數(shù)據(jù)可以幫助我們描述這個世界、闡釋自己的想法和展示自己的成果,但如果只有單調(diào)乏味的文本和數(shù)字,我們卻往往能難抓住觀眾的眼球。而很多時候,一張漂亮的可視化圖表就足以勝過千言萬語
    2022-01-01
  • python求兩個時間的時間差(實例代碼)

    python求兩個時間的時間差(實例代碼)

    我們在用python進行分析的時候,可能會碰到計算兩個日期的時間差。下面為大家介紹一下如何計算兩個時間的時間差,需要的朋友可以參考下
    2022-11-11
  • Pycharm Plugins加載失敗問題解決方案

    Pycharm Plugins加載失敗問題解決方案

    這篇文章主要介紹了Pycharm Plugins加載失敗問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Django 創(chuàng)建新App及其常用命令的實現(xiàn)方法

    Django 創(chuàng)建新App及其常用命令的實現(xiàn)方法

    這篇文章主要介紹了Django 創(chuàng)建新App及其常用命令的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • 解決python3捕獲cx_oracle拋出的異常錯誤問題

    解決python3捕獲cx_oracle拋出的異常錯誤問題

    今天小編就為大家分享一篇解決python3捕獲cx_oracle拋出的異常錯誤問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python 計算機視覺編程進階之OpenCV 進行霍夫變換

    Python 計算機視覺編程進階之OpenCV 進行霍夫變換

    霍夫變換(Hough)是一個非常重要的檢測間斷點邊界形狀的方法。它通過將圖像坐標空間變換到參數(shù)空間,來實現(xiàn)直線與曲線的擬合,通過本篇文章我們來詳細了解它
    2021-11-11
  • python3實現(xiàn)raspberry pi(樹莓派)4驅(qū)小車控制程序

    python3實現(xiàn)raspberry pi(樹莓派)4驅(qū)小車控制程序

    這篇文章主要為大家詳細介紹了python3實現(xiàn)raspberry pi(樹莓派)4驅(qū)小車控制程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論

深圳市| 林芝县| 泰州市| 莒南县| 金寨县| 京山县| 中西区| 靖江市| 永丰县| 吉隆县| 柳林县| 崇仁县| 玉林市| 泰安市| 灵宝市| 昭平县| 海口市| 三亚市| 新乡市| 泰和县| 通化市| 泊头市| 扎兰屯市| 灌云县| 文安县| 高雄县| 读书| 铜川市| 万州区| 龙口市| 栾城县| 勐海县| 安顺市| 乐陵市| 策勒县| 天门市| 喀喇沁旗| 隆德县| 彭泽县| 根河市| 汨罗市|