【问题标题】:Compiling required external modules with cython使用 cython 编译所需的外部模块
【发布时间】:2014-03-21 18:46:05
【问题描述】:

我正在 Linux 上使用 Cython 构建一个独立的可执行文件。

我有以下代码:

import psycopg2 as pg

conn = pg.connect('dbname=**** user=**** password=****')
cur = conn.cursor()
cur.execute('SELECT version()')
print(cur.fetchone())

问题是当机器没有安装Python包psycopg2时,抛出如下异常:

Traceback (most recent call last):
File "test.py", line 2, in init test (test.c:872)
    import psycopg2 as pg
ImportError: No module named 'psycopg2'

我正在使用--embed cython 标志进行构建。

我怎样才能让 Cython 也编译那个特定的包?

【问题讨论】:

  • Cython 主要用于构建扩展,而不是独立的可执行文件。要创建独立的可执行文件,您可以使用 pyinstaller。如果您详细说明您的建筑设置,我可以尝试提供帮助。我并不是说带有 --embed 选项的 cython 不能做到这一点,但是 pyinstaller 有助于将所有依赖项收集到可执行文件中。
  • 可以用 Cython 编译外部 Python 模块吗?假设我想创建一个查询 PostgreSQL 数据库的函数,我使用 psycopg2 模块,还有一种方法可以自动构建该模块吗? @drodri
  • 你可以找到编译标准库的this experimental script。很有可能你也可以编译psycopg2

标签: python cython psycopg2


【解决方案1】:

根据我的经验,从多个 python 文件(您的文件或 psycopg2 等依赖项)创建独立的可执行文件并不是那么简单。 我想说这里有几种方法我会尝试:

第一个是 cython_freeze https://github.com/cython/cython/tree/master/Demos/freeze 我自己不使用它,所以我不能说太多。

第二种是使用 pyinstaller 创建这样的可执行文件。它将 .py 或 .pyc 文件作为输入并将它们与 python 解释器和所需的依赖项一起嵌入到一个可执行文件中,因此您不必在目标机器上安装任何东西。但是请注意,您的代码将作为解释的 python 运行,并且可以轻松反编译和检查。

如果你真的需要编译(cythonize)你的代码,那么你可以先 cythonize() 和 setup() 构建你的扩展,然后像上面一样运行 pyinstaller(注意它找不到 .py 或 .pyc文件,只是 .pyd 或 .so 扩展名)来生成独立的可执行文件。在这两种情况下,pyinstaller 都会收集您所有的依赖项并将它们嵌入到可执行文件中(即使失败,您也可以告诉 pyinstaller 使用 hidden_​​imports 嵌入它们)。

当然还有其他方法,比如 py2exe,但是当我几个月前研究并使用了几种技术时,pyinstaller 是我的最佳选择。我在win、linux和mac中做这个过程,没有太多改动。

编辑:我没有意识到这个例子是 python 3。Pyinstaller 现在只适用于 2.x。

【讨论】:

  • PyInstaller 很棒,我唯一遇到的问题是它还不支持 Python 3。
  • 我明白了,我没有意识到你的代码是 Python 3,对不起
  • 当 90% 的 python 使用在 2.X 中时会发生这种情况;) alexgaynor.net/2014/jan/03/pypi-download-statistics
  • 我也明白,唯一的 Python 3 行是带有 print 的行,这在 Python 2 中也有效,所以,我的错... :)
【解决方案2】:

--embed 表示 Python 解释器嵌入在您的可执行文件中。这并不意味着独立于 Python。它不会像你想的那样做。这听起来更像是你需要一个像 py2exe、py2app 或 pyfreeze 这样的工具。

【讨论】:

    【解决方案3】:

    Nuitka 是您需要的工具。

    你给它你的 Python 应用程序,它会做很多聪明的事情,并输出一个可执行文件或扩展模块。

    现在 Nuitka 是 Python 解释器的一个很好的替代品,它可以编译 CPython 2.6、2.7、3.2、3.3 和 3.4 提供的每一个结构。它将 Python 转换为 C++ 程序,然后使用“libpython”以与 CPython 相同的方式以非常兼容的方式执行。

    它已经比 CPython 快了一些,但目前它并不能实现所有优化,但 pystone 的 258% 因子是一个好的开始(数字来自版本 0.3.11)。

    【讨论】:

      猜你喜欢
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      相关资源
      最近更新 更多