как построить python с помощью node-gyp? - PullRequest
7 голосов
/ 27 марта 2020

Я видел официальный учебник , а также этот , показывающий, как собрать python из исходного кода и отредактировать его в Visual Studio et c., Но как построить его с помощью node-gyp, чтобы использовать его как нативное приложение в узле?

Например, в учебном пособии они говорят вам загрузить исходный код , а затем (в windows) введите этот каталог:

"PCbuild/build.bat"   

, а затем это создаст решение Visual Studio и python в целом и т. Д. c., Но теперь, как мне это сделать с node-gyp? В общем, чтобы включить внешние зависимости для сборки с помощью node-gyp, вы просто включаете их в файл binding.gyp. Для python я сначала установил 64-битную (а позже 32-битную, ту же ошибку, что и ниже) python в C: / Python382, затем скопировал эту папку в другую папку на моем C ++ приложение и установите для файла binding.gyp следующее (чтобы получить include и libs):

{
  "targets": [
    {
        "target_name": "addon",
        "sources": [ 
            "<!@(node -p \"var fs=require('fs'),path=require('path'),walk=function(r){let t,e=[],n=null;try{t=fs.readdirSync(r)}catch(r){n=r.toString()}if(n)return n;var a=0;return function n(){var i=t[a++];if(!i)return e;let u=path.resolve(r,i);i=r+'/'+i;let c=fs.statSync(u);if(c&&c.isDirectory()){let r=walk(i);return e=e.concat(r),n()}return e.push(i),n()}()};walk('./sources').join(' ');\")"
        ],
        "libraries":[
            "C:/Users/Coby/Documents/aa/atzmus/CPPtesting/other/ok/Python382/libs/python38.lib",
            "C:/Users/Coby/Documents/aa/atzmus/CPPtesting/other/ok/Python382/libs/python3.lib",
            "C:/Users/Coby/Documents/aa/atzmus/CPPtesting/other/ok/Python382/libs/_tkinter.lib"
        ],
        "include_dirs": [
            "C:/Users/Coby/Documents/aa/atzmus/CPPtesting/other/ok/Python382/include"
        ],
        "dll_files": [
            "C:/Users/Coby/Documents/aa/atzmus/CPPtesting/other/ok/Python382/python38.dll"
        ]
    }
  ]
}

и мой привет. cc, который является другим источником, просто включает Python.h. Когда я запускаю эту сборку, используя node-gyp build или node-gyp rebuild, она на самом деле строится нормально, без ошибок, но потом, когда я копирую файл addon.node на свой фактический сервер nodeJS, который просто имеет одну строку var addon = require("./addon"), я получаю следующее сообщение об ошибке в CMD (однако, оно прекрасно работает без ошибок, не включая Python .h в мой исходный файл. cc):

internal/modules/cjs/loader.js:1197
  return process.dlopen(module, path.toNamespacedPath(filename));
                 ^

Error: \\?\C:\Users\Coby\Documents\aa\atzmus\testServer\addon.node is not a valid Win32 application.
\\?\C:\Users\Coby\Documents\aa\atzmus\testServer\addon.node
←[90m    at Object.Module._extensions..node (internal/modules/cjs/loader.js:1197
:18)←[39m
←[90m    at Module.load (internal/modules/cjs/loader.js:983:32)←[39m
←[90m    at Function.Module._load (internal/modules/cjs/loader.js:891:14)←[39m
←[90m    at Module.require (internal/modules/cjs/loader.js:1023:19)←[39m
←[90m    at require (internal/modules/cjs/helpers.js:72:18)←[39m
    at Object.<anonymous> (C:\Users\Coby\Documents\aa\atzmus\testServer\oy.js:2:
9)
←[90m    at Module._compile (internal/modules/cjs/loader.js:1128:30)←[39m
←[90m    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:1
0)←[39m
←[90m    at Module.load (internal/modules/cjs/loader.js:983:32)←[39m
←[90m    at Function.Module._load (internal/modules/cjs/loader.js:891:14)←[39m

Основная часть кажется быть:

addon.node is not a valid Win32 application.

Я попытался сделать это с python для 64-битной windows и для 32-битной windows, моя система в 64-битной , моя nodeJS установка 64-битная, но я также пробовал с 32-битной нотой; Я не знаю, как это исправить, или есть ли другой способ полностью построить python с помощью node-gyp?

так:

Какие шаги необходимо выполнить взято в windows для построения python через node-gyp, чтобы иметь возможность использовать python изначально с nodejs без необходимости прибегать к дочернему процессу?

...