代码之家  ›  专栏  ›  技术社区  ›  William Tonkin-Howe

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

  •  5
  • William Tonkin-Howe  · 技术社区  · 6 年前

    我可以通过命令行连接到Postgres没有问题,但是如果我尝试使用psycopg2模块通过Python连接,我会得到下面的错误。有趣的是,我刚刚尝试与PSeqal联系。应用程序和它崩溃时出现相同的错误。

    环境:

    • 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测试数据库。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
    

    到目前为止,我已经尝试了:

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

    所以我有点不知道下一步该怎么做?还有其他人碰到过这个吗?有什么指向哪里的指示吗?任何能帮助我完成这项工作的东西都将不胜感激,谢谢!

    2 回复  |  直到 6 年前
        1
  •  9
  •   William Tonkin-Howe    6 年前

    因此,看起来psycopg2库是罪魁祸首,这为我解决了这个问题:

    $pip3卸载psycopg2
    ...
    已成功卸载psycopg2-binary-2.7.4

    $pip3安装psycopg2二进制文件--无二进制文件:全部:
    正在收集psycopg2二进制文件 下载psycopg2-binary-2.7.4。焦油gz(426kB) 100%--430kB 649kB/s 正在跳过psycopg2二进制文件的bdist\u控制盘,因为它的二进制文件已被禁用。 安装收集的软件包:psycopg2二进制 正在运行安装程序。psycopg2二进制文件的py安装。。。完成
    已成功安装psycopg2-binary-2.7.4

    $python3测试。py公司
    正在连接到PostgreSQL数据库。。。
    一切都很好。
    数据库连接已关闭。

    我之所以相信,是因为我曾试图在2010年的MBP上构建psycopg2,而且它与硬件存在兼容性问题,可能是这台机器的2.66 GHz Intel Core i7处理器。

    感谢@Laurenz Albe和@joop的快速回复、指点和见解,您帮助我缩小了答案的范围,我希望在这份工作期间保持稳定;)干杯

        2
  •  1
  •   Laurenz Albe    6 年前

    根据堆栈跟踪,该错误发生在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';
        }
    }
    

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

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

    这个问题可能在构建PostgreSQL的过程中的某个地方。您应该向构建您使用的二进制文件的包装商投诉。