PYTHON C++混合編程筆記(一)- VS2017 編譯 python 2.7

PYTHON C++混合編程筆記(一)- VS2017 編譯  python 2.7python

0x00 前言編程

最近想把一些經驗和筆記分享出來,也便於本身查詢和複習。windows

 

0x01 環境準備app

1) 下載python 最新2.7.16源代碼 測試

https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tar.xzui

2) VS2017spa

 

0x02 外部庫下載命令行

1)命令行進入到解壓目錄的PCbuild,如X:\Python-2.7.16\PCbuilddebug

2)運行get_externals.bat,下載外部庫,如圖所示code

 

 

 

0x03 編譯

1)打開PCbuild目錄的pcbuild.sln,根據須要選擇後點「肯定」,如圖所示:

 

 

2)先選擇pythonpythoncorewin32 debug 版本測試編譯,如圖所示:

 

 

 

3)編譯失敗,須要修改相關標識符

 

 

4)timezone改成_timezone daylight改成daylight , tzname改成tzname後,從新編譯

 1 #ifdef PYOS_OS2
 2     PyModule_AddIntConstant(m, "timezone", _timezone);
 3 #else /* !PYOS_OS2 */
 4     PyModule_AddIntConstant(m, "timezone", _timezone);
 5 #endif /* PYOS_OS2 */
 6 #ifdef HAVE_ALTZONE
 7     PyModule_AddIntConstant(m, "altzone", altzone);
 8 #else
 9 #ifdef PYOS_OS2
10     PyModule_AddIntConstant(m, "altzone", _timezone-3600);
11 #else /* !PYOS_OS2 */
12     PyModule_AddIntConstant(m, "altzone", _timezone -3600);
13 #endif /* PYOS_OS2 */
14 #endif
15     PyModule_AddIntConstant(m, "daylight", _daylight);
16     PyModule_AddObject(m, "tzname",
17                        Py_BuildValue("(zz)", _tzname[0], _tzname[1]));

 

5)編譯仍然失敗,以下圖所示:

 

 

6)找到pythoncore 工程的posixmodule.c , 修改_PyVerify_fd以下

/* This function emulates what the windows CRT does to validate file handles */
int
_PyVerify_fd(int fd)
{
  //  const int i1 = fd >> IOINFO_L2E;
  //  const int i2 = fd & ((1 << IOINFO_L2E) - 1);

  //  static int sizeof_ioinfo = 0;

  //  /* Determine the actual size of the ioinfo structure,
  //   * as used by the CRT loaded in memory
  //   */
  //  if (sizeof_ioinfo == 0 && __pioinfo[0] != NULL) {
  //      sizeof_ioinfo = _msize(__pioinfo[0]) / IOINFO_ARRAY_ELTS;
  //  }
  //  if (sizeof_ioinfo == 0) {
  //      /* This should not happen... */
  //      goto fail;
  //  }

  //  /* See that it isn't a special CLEAR fileno */
  //  if (fd != _NO_CONSOLE_FILENO) {
  //      /* Microsoft CRT would check that 0<=fd<_nhandle but we can't do that.  Instead
  //       * we check pointer validity and other info
  //       */
  //      if (0 <= i1 && i1 < IOINFO_ARRAYS && __pioinfo[i1] != NULL) {
  //          /* finally, check that the file is open */
  //          my_ioinfo* info = (my_ioinfo*)(__pioinfo[i1] + i2 * sizeof_ioinfo);
  //          if (info->osfile & FOPEN) {
  //              return 1;
  //          }
  //      }
  //  }
  //fail:
  //  errno = EBADF;
    //a call to _get_osfhandle with invalid fd sets errno to EBADF
    if (_get_osfhandle(fd) == INVALID_HANDLE_VALUE)
        return 0;
    else
        return 1;
    return 0;
}

 

7)再次編譯,編譯成功。

 

 

8)根據須要選擇相應庫進行編譯

 

0x04 後記

C++ 調用python的工程中, 若是是debug必須使用debug版本的python,若是是release必須使用release版本編譯的python,包括全部庫的libdebug必須使用***_d.lib

相關文章
相關標籤/搜索