Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用cython编译所需的外部模块_Python_Cython_Psycopg2 - Fatal编程技术网

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

Python 用cython编译所需的外部模块,python,cython,psycopg2,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 rece

我正在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'
Im使用
--embed
cython标志构建


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

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

第一个是cython_freeze,我自己不用,所以我说不出多少

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

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

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

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

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

是您需要的工具

你把你的Python应用程序提供给它,它做了很多聪明的事情,并给出了一个可执行或扩展模块

现在Nuitka是Python解释器的一个很好的替代品,它编译CPython2.6、2.7、3.2、3.3和3.4提供的每一个构造。它将Python翻译成C++程序,然后使用“Lypython”以与CPython相同的方式执行,非常兼容。 它已经比CPython快了一些,但是目前它并没有使所有的优化成为可能,但是pystone上的258%因子是一个很好的开始(这个数字来自版本0.3.11)


Cython主要用于构建扩展,而不是独立的可执行文件。要创建独立的可执行文件,可以使用pyinstaller。如果你能详细介绍一下你的建筑设置,我可以帮你。我并不是说带有--embed选项的cython不能做到这一点,但是pyinstaller帮助我们将所有依赖项收集到可执行文件中。cython可以用来编译外部Python模块吗?假设我想创建一个查询PostgreSQL数据库的函数,我使用psycopg2模块,有没有一种方法可以自动构建该模块@您可以找到编译标准库的方法。你也很有可能编译
psycopg2
。PyInstaller很棒,我唯一的问题是它还不支持Python3。我明白了,我没有意识到你的代码是Python3,很抱歉,当Python 90%的使用在2.X;)中时会发生这种情况我也明白,Python3中唯一的一行是带有打印的,这在Python2中也是有效的,所以,我的错误…:)