我无法获得已编译的 python 脚本所看到的其他可用模块。我需要如何更改以下流程才能接受基于 venv 的模块或全局模块?
脚步:
$ python3 -m venv sometest
$ cd sometest
$ . bin/activate
(sometest) $ pip3 install PyCrypto Cython
Run Code Online (Sandbox Code Playgroud)
使用非标准模块的基本脚本Crypto
:
# hello.py
from Crypto.Cipher import AES
import base64
obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
msg = "The answer is no"
ciphertext = obj.encrypt(msg)
print(msg)
print(base64.b64encode(ciphertext))
Run Code Online (Sandbox Code Playgroud)
(sometest) $ python3 hello.py
The answer is no
b'1oONZCFWVJKqYEEF4JuL8Q=='
Run Code Online (Sandbox Code Playgroud)
编译它:
(sometest) $ cython -3 --embed hello.py
(sometest) $ gcc -Os -I /usr/include/python3.5m -o hello …
Run Code Online (Sandbox Code Playgroud) TL;DR:如何使用 Cython 作为分发方法而不是 Py2exe、cx_freeze、pyinstaller 等。
继在用Cython制作一个可执行的,我想看看它怎么可能给一个Python程序分发到任何Windows用户(谁没有的Python已经安装了机上),通过用Cython第一编译它--embed
。
让我们使用一个test.py
:
import json
print(json.dumps({'key': 'hello world'}))
Run Code Online (Sandbox Code Playgroud)
并编译它:
cython test.py --embed
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64
cl test.c /I C:\Python37\include /link C:\Python37\libs\python37.lib
Run Code Online (Sandbox Code Playgroud)
它可以工作并生成一个 140KB 的test.exe
可执行文件。
test.exe
在另一台机器上运行不能开箱即用,它需要:
即使这样,它仍然不起作用(下面的屏幕截图而不是复制/粘贴,因为我没有管理 VM 中的复制/粘贴 - 此处偏离主题):
ModuleNotFoundError:没有名为“编码”的模块
问题:分发--embed
-Cython 编译的代码并使其在任何机器上运行(之前没有安装 Python)所需的最小文件集是什么?