我正在尝试将我的代码发送到远程服务器,该服务器可能安装了不同的 python 版本和/或可能没有我的应用所需的包。
现在要实现这种可移植性,我必须使用解释器和代码构建可重定位的 virtualenv。这种方法存在一些问题(例如,您必须手动将一堆库复制到您的 virtualenv 中,因为 --always-copy
无法按预期工作)并且通常很慢。
有(理论上)a way静态构建python本身。
我想知道我是否可以将解释器与我的代码打包成一个二进制文件并将我的应用程序作为模块运行。类似的东西:./mypython -m myapp run
或 ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application
.
最佳答案
有两种方法可以解决您的问题
- 使用静态构建器,例如 freeze、
pyinstaller
或py2exe
- 使用
cython
编译
此答案解释了如何使用第二种方法进行操作,因为第一种方法不是跨平台和版本的,并且已在其他答案中进行了解释。此外,使用 pyinstaller 之类的程序通常会导致文件很大,而使用 cython 会导致文件更小
首先,安装
cython
。sudo -H pip3 install cython
然后,您可以使用
cython
从 Python.py
文件中生成 C 文件 (引用 https://stackoverflow.com/a/22040484/5714445 )cython example_file.py --embed
获取当前python版本后使用GCC编译(注意:以下假设您正在尝试将其编译为Python3)
PYTHONLIBVER=python$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))')$(python3-config --abiflags) gcc -Os $(python3-config --includes) example_file.c -o output_bin_file $(python3-config --ldflags) -l$PYTHONLIBVER
您现在将拥有一个二进制文件 output_bin_file
,这就是您要查找的内容
其他注意事项:
- 将
example_file.py
更改为您实际尝试编译的任何文件。 - Cython 用于使用 C 类型变量定义进行静态内存分配,以加速 Python 程序。但是,在您的情况下,您仍将使用传统的 Python 定义。
- 如果您使用其他库(例如
opencv
),您可能必须使用-L
向它们提供目录,然后指定在 GCcflags中使用-l
的库。有关这方面的更多信息,请参阅 GCcflags - 上述方法可能不适用于 anaconda python,因为您可能必须安装与您的 conda-python 兼容的 gcc 版本。
关于python - 有没有办法将 python 应用程序编译成静态二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39913847/