使用cython编译所需的外部模块

时间:2014-03-21 18:46:05

标签: python cython psycopg2

我正在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编译该特定包?

2 个答案:

答案 0 :(得分:5)

根据我的经验,从多个python文件(你的或者像psycopg2这样的依赖项)创建一个独立的可执行文件并不是那么简单。 我想说我会尝试一些方法:

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

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

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

肯定还有其他方法,比如py2exe,但几个月前我研究和使用过几种技术时,pyinstaller对我来说是最好的选择。我在win,linux和mac中完成了这个过程而没有太多变化。

编辑:我没有意识到示例是python 3. Pyinstaller现在仅适用于2.x.

答案 1 :(得分:5)

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