高Sierra + Python + Postgresql错误:非法指令:4

问题描述 投票:4回答:2

我可以通过命令行连接到Postgres没问题,但是如果我尝试使用psycopg2模块通过Python连接,我会收到以下错误。有趣的是,我刚刚尝试连接PSeqal.app,它崩溃了同样的错误。

环境:

  • MacOS:10.13.3
  • Xcode 9.2
  • Python:3.6.4 连接模块:psycopg2
  • Postgresql:10.3

脚本:

这是我的简单连接脚本,它试图通过Python连接到Postgresql:

def connect(self, params):
    """ Connect to the PostgreSQL database server """

    conn = None
    try:
        # connect to the PostgreSQL server
        logging.info('Connecting to the PostgreSQL database...')
        conn = psycopg2.connect(**params)

        # create a cursor
        self.cursor = conn.cursor()

        except (Exception, psycopg2.DatabaseError) as error:
            print(error)
        finally:
            if conn is not None:
                conn.close()
                logging.warning('Database connection closed.')

错误:

脚本输出:

$ python3 testdb.py 非法指导:4

Apple错误(部分):

Process:               Python [79534]
Path:                  /usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/Resources/Python.app/Contents/MacOS/Python
Identifier:            Python
Version:               3.6.4 (3.6.4)
Code Type:             X86-64 (Native)
Parent Process:        bash [657]
Responsible:           Python [79534]
User ID:               501

Date/Time:             2018-03-02 15:30:27.642 +1300
OS Version:            Mac OS X 10.13.3 (17D102)
Report Version:        12
Anonymous UUID:        xx


Time Awake Since Boot: 21000 seconds

System Integrity Protection: disabled

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes:       0x0000000000000001, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Signal:    Illegal instruction: 4
Termination Reason:    Namespace SIGNAL, Code 0x4
Terminating Process:   exc handler [0]

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 
0   libpq.5.10.dylib                0x00000001118e8d27 initPQExpBuffer + 32
1   libpq.5.10.dylib                0x00000001118dba93 PQconninfoParse + 43
2   _psycopg.cpython-36m-darwin.so  0x0000000111897cf1 psyco_parse_dsn + 113
3   org.python.python               0x000000010fd4681a _PyCFunction_FastCallDict + 463
4   org.python.python               0x000000010fdaad8e call_function + 489
5   org.python.python               0x000000010fda3c43 _PyEval_EvalFrameDefault + 4811
6   org.python.python               0x000000010fdab4f0 _PyEval_EvalCodeWithName + 1719
7   org.python.python               0x000000010fda293d PyEval_EvalCodeEx + 57
8   org.python.python               0x000000010fd2ec76 function_call + 339
9   org.python.python               0x000000010fd0e9f2 PyObject_Call + 101
10  org.python.python               0x000000010fda3eac _PyEval_EvalFrameDefault + 5428
11  org.python.python               0x000000010fdab4f0 _PyEval_EvalCodeWithName + 1719
12  org.python.python               0x000000010fda293d PyEval_EvalCodeEx + 57
13  org.python.python               0x000000010fd2ec76 function_call + 339
14  org.python.python               0x000000010fd0e9f2 PyObject_Call + 101
15  org.python.python               0x000000010fda3eac _PyEval_EvalFrameDefault + 5428
16  org.python.python               0x000000010fdabe93 _PyFunction_FastCall + 121
17  org.python.python               0x000000010fdaad65 call_function + 448
18  org.python.python               0x000000010fda3c43 _PyEval_EvalFrameDefault + 4811
19  org.python.python               0x000000010fdabe93 _PyFunction_FastCall + 121
20  org.python.python               0x000000010fd0eb71 _PyObject_FastCallDict + 196
21  org.python.python               0x000000010fd0ec94 _PyObject_Call_Prepend + 156
22  org.python.python               0x000000010fd0e9f2 PyObject_Call + 101
23  org.python.python               0x000000010fd598ae slot_tp_init + 57
24  org.python.python               0x000000010fd5683c type_call + 184
25  org.python.python               0x000000010fd0eb3c _PyObject_FastCallDict + 143
26  org.python.python               0x000000010fdaad5e call_function + 441
27  org.python.python               0x000000010fda3c43 _PyEval_EvalFrameDefault + 4811
28  org.python.python               0x000000010fdabe93 _PyFunction_FastCall + 121
29  org.python.python               0x000000010fd0eb71 _PyObject_FastCallDict + 196
30  org.python.python               0x000000010fd0ec94 _PyObject_Call_Prepend + 156
31  org.python.python               0x000000010fd0e9f2 PyObject_Call + 101
32  org.python.python               0x000000010fd598ae slot_tp_init + 57
33  org.python.python               0x000000010fd5683c type_call + 184
34  org.python.python               0x000000010fd0eb3c _PyObject_FastCallDict + 143
35  org.python.python               0x000000010fdaad5e call_function + 441
36  org.python.python               0x000000010fda3c43 _PyEval_EvalFrameDefault + 4811
37  org.python.python               0x000000010fdab4f0 _PyEval_EvalCodeWithName + 1719
38  org.python.python               0x000000010fda28fe PyEval_EvalCode + 42
39  org.python.python               0x000000010fdcb24e run_mod + 54
40  org.python.python               0x000000010fdca26f PyRun_FileExFlags + 160
41  org.python.python               0x000000010fdc994c PyRun_SimpleFileExFlags + 285
42  org.python.python               0x000000010fddd770 Py_Main + 3484
43  org.python.python               0x000000010fd01e1d 0x10fd00000 + 7709
44  libdyld.dylib                   0x00007fff6c260115 start + 1

Thread 0 crashed with X86 Thread State (64-bit):
rax: 0x00007f86c3db9200  rbx: 0x00007ffedfefe3a0  rcx: 0x0000000000000100  rdx: 0x0000000000010000
rdi: 0x0000000000000b93  rsi: 0x00000000ffff0001  rbp: 0x00007ffedfefe390  rsp: 0x00007ffedfefe380
r8: 0x000000006c3db930   r9: 0x000000000000000f  r10: 0x00000000ffff0000  r11: 0x00007f86c3d00000
r12: 0x0000000110665738  r13: 0x0000000111c68510  r14: 0x0000000111cb80b0  r15: 0x00007ffedfefe3a0
rip: 0x00000001118e8d27  rfl: 0x0000000000010206  cr2: 0x00000001118ef90e

Logical CPU:     2
Error Code:      0x00000000
Trap Number:     6

到目前为止我尝试过的:

  • 从3.5.1升级到3.6.4的Python 重建所有依赖库,包括psycopg2,以确保它们与High Sierra兼容(我希望)
  • 从头开始重新安装Postgres
  • 升级的Xcode +工具

所以接下来要尝试什么我有点不知所措?有没有其他人遇到这个?有什么指向哪里看?任何有助于我工作的东西都将非常感谢!

python python-3.x macos postgresql psycopg2
2个回答
9
投票

所以它看起来像psycopg2库是罪魁祸首,这为我修复了它:

$ pip3卸载psycopg2 ... 成功卸载psycopg2-binary-2.7.4 $ pip3安装psycopg2-binary --no-binary:all: 收集psycopg2-binary下载psycopg2-binary-2.7.4.tar.gz(426kB)100%| --- | 430kB 649kB / s为psycopg2-binary跳过bdist_wheel,因为二进制文件被禁用。安装收集的软件包:psycopg2-binary运行setup.py install for psycopg2-binary ... done 已成功安装psycopg2-binary-2.7.4 $ python3 test.py 连接到PostgreSQL数据库...... 都好。 数据库连接关闭。

我认为这与我试图在2010年MBP专门构建psycopg2这一事实有关,它与硬件有兼容性问题 - 可能是这台机器的2.66 GHz Intel Core i7处理器。

感谢@Laurenz Albe和@joop的快速回复,指示和见解,你帮助我缩小到这个答案,我希望在这份工作期间保持稳定;)干杯!


1
投票

根据堆栈跟踪,在这个无害的代码段中,PostgreSQL客户端发生了这个错误:

/*
 * initPQExpBuffer
 *
 * Initialize a PQExpBufferData struct (with previously undefined contents)
 * to describe an empty string.
 */
void
initPQExpBuffer(PQExpBuffer str)
{
    str->data = (char *) malloc(INITIAL_EXPBUFFER_SIZE);
    if (str->data == NULL)
    {
        str->data = (char *) oom_buffer;    /* see comment above */
        str->maxlen = 0;
        str->len = 0;
    }
    else
    {
        str->maxlen = INITIAL_EXPBUFFER_SIZE;
        str->len = 0;
        str->data[0] = '\0';
    }
}

我发现thisthis问题处理类似的问题。

非法指令应该意味着执行遇到了不存在的指令代码,这可能是编译器错误,也可能意味着代码是为具有不同指令集的处理器构建的。

问题很可能出现在构建PostgreSQL的过程中。您应该将此投诉提交给构建您正在使用的二进制文件的打包者。

© www.soinside.com 2019 - 2024. All rights reserved.