一、将单个py文件打包成pyd
1、环境
win10、python3.7.4
2、安装cython模块
pip install cython
3、编写setup.py文件
如:
speakHello.py
def aa():
print('hello world')
hello.py
import sys, os
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
from qfs import speakHello
speakHello.aa()
setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("speakHello.py"))
4、执行 python setup.py build_ext 命令
会在当前目录下的 ./build/lib.win-amd64-3.7 目录下生成pyd文件: speakHello.cp37-win_amd64.pyd
可以添加 --inplace参数, 直接在当前目录下生成与py文件同名的pyd文件:printHello.cp37-win_amd64.pyd
python setup.py build_ext --inplace
5、使用pyd文件
将文件名修改为 speakHello.pyd , 然后将文件放到当前目录, 删除 speakHello.py
执行: python3 hello.py
输出:hello world
1、pyd文件可以向py文件一样正常导入使用, 在win10上编译后, 在win7同样可以运行。
2、pyd文件无法直接运行, 需要通过导入来运行。对于一个项目来说,可以将pyd导入到项目启动文件中运行, 然后将项目启动文件打包成exe或其他格式的可执行文件。
3、同名的py和pyd并存时, pyd文件会优先被调用。
二、报错及解决
1、“Unable to find vcvarsall.bat”
解决:安装VS
VS下载:https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/?rr=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fcpp%2Fbuild%2Fvscpp-step-0-installation%3Fview%3Dvs-2015
下载 community 版本, 安装时选择安装python开发, 安装完成后重启。
2 speakHello.py:1:0: ‘qfs.speakHello’ is not a valid module name
将speakHello.py和setup.py都放入到了qfs 文件夹下,在pycharm中python setup.py build_ext --inplace执行,报以上错误
调试错误原因为qfs 文件夹中有__init__.py文件, 删除这个文件即可
参考
https://devblogs.microsoft.com/python/unable-to-find-vcvarsall-bat/#comments
https://blog.baosiqiang.cn/archives/75cf9cb3.html
https://developer.aliyun.com/article/1113536
https://zxkjack123.github.io/cython/cython-hello-world/
https://cython.readthedocs.io/en/latest/src/userguide/external_C_code.html#resolving-naming-conflicts-c-name-specifications
练习:
单个py文件编译为pyd文件:https://download.csdn.net/download/YPFeime/12186951