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

最近用python写了一个小程序,想发布出去让人试用又不想暴露源码,搜索了一下发现将py文件编译成pyd文件就能达到目的。

转换过程很简单,但是在调用pyd文件并且打包为单个exe文件的时候遇到一个坑,搞了一天才解决,在这里分享一下。

首先安装cython库

个人比较喜欢用清华的镜像库,速度快。

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

然后创建一个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”这一段可以删除,不删除也可以正常调用;但原文件名字段不能改变。

接下来需要打包发布为.exe文件

我用的是pyinstaller,还是用清华镜像库安装。

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

根据一些教程,有的说在命令行直接输入:

pyinstaller -F BetaV14.py

就能直接引用pyd文件打包发布exe文件,但是在我这里出现文件缺失的错误:

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

继续查找问题,发现需要用一个入口程序来导入pyd文件,于是创建一个main.py文件,import刚才生成的模块,pyd文件默认优先级高于py文件,可以在后面解包exe文件来验证。

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

这里需要注意的是程序的__main__入口只能有一个,如果源py文件中有定义main入口,需要注释掉并调整代码缩进,否则通过main.py调用pyd文件遇到if name == ‘main':之后的代码都不会运行。

接着命令行输入:

pyinstaller -F main.py

打包成.exe文件,在dist目录下发现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文件夹,在文件夹下发现文件BetaV14.pyd,说明通过引用pyd文件打包成功。

在此作为一个初学者记录一下自己遇到的坑,让大佬们见笑了。

补充:python打包编译成pyd或者_python之setup.py的那些事

今天偶然对setup.py产生了兴趣,以前只知道可以用它来安装包,例如

python setup.py build ->python setup.py install.当然前提你下载的这个源码包是压缩的,之前对这个理解并不深,今天偶然看见pip install -e . 的用法,然后串起来想了一下。

我的目录结构如上,首先我创建了一个setuptutorial的directory,然后我在下面创建了greet_pkg的python package,并且在setuptutorial下面创建了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规则在其他文件里面导入,当然如果写的不规范,及其的容易出问题,这里我提供另外一个思路,在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文件里面的实现,和linux下的so文件类似。

有类似py->pyd功能的有easycython模块,可以直接pip安装。

有人可能会说pyc也看不见源码吗?

但是他可以被反编译23333

至于如何将py编译成pyc或pyo

可以使用py_compile或者compileall,不了解的可以自行搜索一下,都有很多的例子,还有针对pyc的反编译库,都可以搜到,至此setup.py我所了解的功能都谈完了,里面还有很多参数可以灵活配置,实现更加炫酷的效果可以查看这个链接setup.py

(0)

相关推荐

  • python 指定源路径来解决import问题的操作

    用python做大型工程时,经常会出现import问题.比如,当你import另一个py文件时,这个py不存在于你的运行路径下,便会报错. 大概有两种方法: 如果在terminal里,咱们可以通过sys.path.append来添加运行路径:如果在pycharm环境里,咱们可以右键Mark Directory as Sources Root. 举个栗子:vim head.py def add(a, b): return a + b vim run.py import head a = 3 b =

  • selenium+python自动化78-autoit参数化与批量上传功能的实现

    前言 前一篇autoit实现文件上传打包成.exe可执行文件后,每次只能传固定的那个图片,我们实际测试时候希望传不同的图片. 这样每次调用的时候,在命令行里面加一个文件路径的参数就行. 一.命令行参数 1.参数化传入的参数,可以通过autoit的命令行参数: myProg.exe param1 "This is a string parameter" 99 在脚本中,可用以下变量获取命令行参数: $CmdLine[0] ; = 3 $CmdLine[1] ; = param1 $Cmd

  • python 与HFSS联合仿真的教程讲解

    看了很多其他人写的,python与HFSS联合仿真的博客,但说实话,都没有说到点子上.今天,给大家说说我的思路. python与HFSS联合仿真,有3种思路.下边一一介绍. 第一种 在HFSS中,选择tools-->record script to file ,选择导出到py文件即可.HFSS就会将你接下来的操作,转换为代码. 而你以后使用的时候,只需要改一下参数就可以了. 需要注意的是,这个python不可以直接用python编译器运行的,因为ScripEnv库,是HFSS自己的库. 如果要仿

  • python 中 .py文件 转 .pyd文件的操作

    pyd文件生成 安装easycython库 pip install easycython test.py def test(): print("调用成功") main.py import test test.test() test.py文件重命名为:test.pyx 终端运行命令 easycython *.pyx 重命名pyd文件,删除:cp36-win_amd64. 运行代码,调用成功: python main.py 代码实现 import glob import os def ge

  • Python实现图片指定位置加图片水印(附Pyinstaller打包exe)

    (一)功能实现效果: 选择文件的效果: 标记预加水印的位置: (二)Python代码: # -*l- coding:utf-8 * import os, io, sys, re, time, json from pandas import array import matplotlib.backends.backend_tkagg import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt #from mat

  • Python .py生成.pyd文件并打包.exe 的注意事项说明

    最近用python写了一个小程序,想发布出去让人试用又不想暴露源码,搜索了一下发现将py文件编译成pyd文件就能达到目的. 转换过程很简单,但是在调用pyd文件并且打包为单个exe文件的时候遇到一个坑,搞了一天才解决,在这里分享一下. 首先安装cython库 个人比较喜欢用清华的镜像库,速度快. pip install Cyphton -i https://pypi.tuna.tsinghua.edu.cn/simple 然后创建一个setup.py文件 写入以下内容: from distuti

  • Python实现的远程文件自动打包并下载功能示例

    本文实例讲述了Python实现的远程文件自动打包并下载功能.分享给大家供大家参考,具体如下: 一 点睛 在Linux系统集群运营当中,时常需要批量远程执行Linux命令,并且双向同步文件的操作. 本示例通过使用spawn()方法执行ssh.scp 命令的思路来实现. 二 代码 import pexpect import sys ip="192.168.0.104" user="root" passwd="123456" target_file=&

  • python django生成迁移文件的实例

    关于Django生成迁移文件,我是在虚拟机上完成的 1.创建虚拟环境: 在终端上输入创建python3的虚拟环境 mkvirtualenv -p python3 虚拟环境的名字 在虚拟环境中安装好django1.8.4和pymysql 2.创建项目 创建项目语句:django-admin startproject 项目名字 创建APP:python manage.py startapp 模块名字 这时,我们要在pycham中打开这个项目,并在项目名的同名文件夹下的settings.py的INST

  • caffe的python接口生成deploy文件学习示例

    目录 如果要把训练好的模型拿来测试新的图片,那必须得要一个deploy.prototxt文件,这个文件实际上和test.prototxt文件差不多,只是头尾不相同而也.deploy文件没有第一层数据输入层,也没有最后的Accuracy层,但最后多了一个Softmax概率层. 这里我们采用代码的方式来自动生成该文件,以mnist为例. deploy.py # -*- coding: utf-8 -*- from caffe import layers as L,params as P,to_pro

  • Python如何生成xml文件

    用python内置的xml.dom可以对xml文件进行解析处理. 什么是xml? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 被设计为具有自我描述性. XML 是 W3C 的推荐标准 xml.dom具体操作实例: 本例通过xml模块对xml文件进行写入操作 from xml.dom.minidom import Document doc = Document() p

  • caffe的python接口生成solver文件详解学习

    目录 solver.prototxt的文件参数设置 生成solver文件 简便的方法 训练模型(training) solver.prototxt的文件参数设置 caffe在训练的时候,需要一些参数设置,我们一般将这些参数设置在一个叫solver.prototxt的文件里面,如下: base_lr: 0.001display: 782gamma: 0.1lr_policy: “step”max_iter: 78200momentum: 0.9snapshot: 7820snapshot_pref

  • pyx文件 生成pyd 文件用于 cython调用的实现

    pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行.我在eric4上写的,结果它默认用python解释器来进行解释,还提示有bug,"语法错误". 上面的pyx文件还仅仅是源代码文件,要想被python调用.要想运行,仅仅写了源代码还是不够的.具体来说,还要转成.c或者.c++的文件,并且再进一步转成.pyd文件. pyd文件才是可以直接使用的文件.为了达到上述目的,就要写一个setup.py脚本,如下: #!/usr/bin/python #pyt

  • python自动生成model文件过程详解

    生成方式 Python中想要自动生成 model文件可以通过 sqlacodegen这个命令来生成对应的model文件 sqlacodegen 你可以通过pip去安装: pip install sqlacodegen 格式: sqlacodegen mysql+pymysql://username:password@host/database_name > model.py 说明: mysql+pymysql : 表示连接数据库的连接方式 username : 连接MySQL数据库的用户名 pa

  • python打包生成so文件的实现

    1.安装工具 python3 安装:cython pip3 install cython -i http://mirrors.aliyun.com/pypi/simple/ pip国内的一些镜像   阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣(douban) http://pypi.douban.com/simple/ 清华大学 https://pypi

随机推荐