我想做的是将我的代码发送到远程服务器,该服务器可能安装了不同的python版本和/或可能没有我的应用程序所需的软件包。

现在,要实现这种可移植性,我必须使用解释器和代码来构建可重定位的virtualenv。这种方法存在一些问题(例如,由于--always-copy无法按预期工作,因此您必须手动将一堆库复制到virtualenv中),并且速度通常很慢。

从理论上讲,有a way可以静态地构建python本身。

我想知道是否可以将解释器和代码一起打包到一个二进制文件中,然后将应用程序作为模块运行。像这样:./mypython -m myapp run./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application

最佳答案

有两种方法可以解决您的问题

  • 使用静态生成器,例如freeze或pyinstallerpy2exe
  • 使用cython编译

  • 我将解释如何使用第二种方法,因为第一种方法不是跨平台和跨版本的,并且已在其他答案中进行了解释。另外,使用pyinstaller之类的程序通常会导致文件很大,而使用cython会导致文件大小为KB

    首先,安装cython。然后,将您的python文件(例如test.py)重命名为.pyx文件
    sudo pip install cython
    mv test.py test.pyx
    

    然后,您可以将cython与GCC一起使用进行编译(cython从Python .pyx文件中生成一个C文件,然后GCC编译该C文件)

    (引用https://stackoverflow.com/a/22040484/5714445)
    cython test.pyx --embed
    gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl
    

    注意:根据您的python版本,您可能必须更改最后一个命令。要知道您使用的是哪个版本的python,只需使用
    $ python -V
    

    现在,您将找到一个二进制文件“test”

    需要注意的其他事项:
  • Cython用于将C类型变量定义用于静态内存分配,以加速Python程序。但是,就您而言,您仍将使用传统的Python定义。
  • 如果您正在使用其他库(例如opencv),则可能必须使用-L向它们提供目录,然后在GCC标志中使用-l指定库的名称。有关更多信息,请参阅GCC标志
  • 关于python - 有没有办法将python应用程序编译成静态二进制文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39913847/

    10-11 22:20
    查看更多