我想做的是将我的代码发送到远程服务器,该服务器可能安装了不同的 python 版本和/或可能没有我的应用程序所需的包。
现在为了实现这种可移植性,我必须使用解释器和代码构建可重定位的 virtualenv。这种方法有一些问题(例如,您必须手动将一堆库复制到您的 virtualenv 中,因为--always-copy
不按预期工作)并且通常很慢。
有(理论上)a way https://wiki.python.org/moin/BuildStatically静态构建 python 本身。
我想知道是否可以将解释器与我的代码打包到一个二进制文件中并将我的应用程序作为模块运行。像这样的东西:./mypython -m myapp run
or ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application
.
有两种方法可以解决您的问题
- 使用静态构建器,例如冻结,或者
pyinstaller
, or py2exe
- 编译使用
cython
这个答案解释了如何使用第二种方法来执行此操作,因为第一种方法不是跨平台和版本的,并且已在其他答案中进行了解释。此外,使用 pyinstaller 等程序通常会产生巨大的文件大小,而使用 cython 会产生小得多的文件
-
首先,安装cython
.
sudo -H pip3 install cython
-
然后,您可以使用cython
从 Python 生成 C 文件.py
文件
(在参照https://stackoverflow.com/a/22040484/5714445 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
,这就是您正在寻找的
其他注意事项:
- Change
example_file.py
到您实际尝试编译的任何文件。
- Cython 用于使用 C 类型变量定义进行静态内存分配,以加速 Python 程序。然而,就您的情况而言,您仍将使用传统的 Python 定义。
- 如果您正在使用其他库(例如
opencv
,例如),您可能必须使用以下方式向他们提供目录-L
然后使用指定库的名称-l
在海湾合作委员会旗帜中。有关这方面的更多信息,请参阅 GCC 标志
- 上述方法可能不适用于 anaconda python,因为您可能必须安装与您的 conda-python 兼容的 gcc 版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)