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

Sim*_*oño 8 python psycopg2 cython

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

我有以下代码:

import psycopg2 as pg

conn = pg.connect('dbname=**** user=**** password=****')
cur = conn.cursor()
cur.execute('SELECT version()')
print(cur.fetchone())
Run Code Online (Sandbox Code Playgroud)

问题是当机器没有安装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'
Run Code Online (Sandbox Code Playgroud)

我正在建设使用--embedcython标志.

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

dro*_*dri 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.


Stu*_*den 5

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